Страницы

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

четверг, 9 января 2020 г.

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

#cpp #cpp11


Не пойму как в С++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));

    


Ответы

Ответ 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); } Запустить в онлайн компиляторе

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

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