Страницы

Поиск по вопросам

понедельник, 18 февраля 2019 г.

Как написать такую шаблонную функцию?

Не пойму как в С++11 написать такую хотелку:
tempalte struct Object { typedef std::function CallbackFunction;
void registerCallback(const CallbackFunction&); };
template typedef T::Signature createCallback(T& obj, int id) { void * addr = &obj; return [addr, id](??????) { std::cout << addr << id; }; }
Идея в том, что зная тип сингануры, сгенерировать лямбду, которой пофиг на аргументы и она делает что-то простое.
Пример использования:
Object obj1; obj1.registerCallback(createCallback(obj1, 42));
Object obj2; obj2.registerCallback(createCallback(obj2, 777));


Ответ

Например вот так:
#include #include #include
template struct Object { using CallbackFunction = ::std::function;
void registerCallback(const CallbackFunction &) {} };
template auto makeResult(void) -> TResult { return(TResult{}); }
template<> auto makeResult(void) -> void { return; }
template class t_CallbackWrapper;
template class t_CallbackWrapper final { private: void * m_p_obj; private: int m_id;
public: explicit t_CallbackWrapper(void * const p_obj, int const id): m_p_obj{p_obj}, m_id{id} {}
public: auto operator ()(TArgs...) const -> TResult { ::std::cout << m_p_obj << m_id; return(makeResult()); } };
template auto makeCallback(Object & obj, int id) -> typename Object::CallbackFunction { return ( typename Object::CallbackFunction { t_CallbackWrapper{::std::addressof(obj), id} } ); }
int main() { Object obj1; obj1.registerCallback(makeCallback(obj1, 42));
Object obj2; obj2.registerCallback(makeCallback(obj2, 777));
::std::cout.flush(); return(0); }
Запустить в онлайн компиляторе

Комментариев нет:

Отправить комментарий