#cpp #cpp11
Не пойму как в С++11 написать такую хотелку: tempaltestruct 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));
Ответы
Ответ 1
Например вот так: #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); } Запустить в онлайн компиляторе
Комментариев нет:
Отправить комментарий