Не пойму как в С++11 написать такую хотелку:
tempalte<class Signature>
struct Object
{
typedef std::function<Signature> CallbackFunction;
void registerCallback(const CallbackFunction&);
};
template<class T, ?????>
typedef T::Signature createCallback(T& obj, int id)
{
void * addr = &obj;
return [addr, id](??????) { std::cout << addr << id; };
}
Идея в том, что зная тип сингануры, сгенерировать лямбду, которой пофиг на аргументы и она делает что-то простое.
Пример использования:
Object<void()> obj1;
obj1.registerCallback(createCallback(obj1, 42));
Object<int(A1, A2*, const A3&)> obj2;
obj2.registerCallback(createCallback(obj2, 777));
Например вот так:
#include <iostream>
#include <functional>
#include <memory>
template<typename TSignature> struct
Object
{
using
CallbackFunction = ::std::function<TSignature>;
void
registerCallback(const CallbackFunction &) {}
};
template<typename TResult> auto
makeResult(void) -> TResult
{
return(TResult{});
}
template<> auto
makeResult<void>(void) -> void
{
return;
}
template<typename TSignature> class
t_CallbackWrapper;
template<typename... TArgs, typename TResult> class
t_CallbackWrapper<TResult (TArgs...)> 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<TResult>());
}
};
template<typename TSignature> auto
makeCallback(Object<TSignature> & obj, int id) -> typename Object<TSignature>::CallbackFunction
{
return
(
typename Object<TSignature>::CallbackFunction
{
t_CallbackWrapper<TSignature>{::std::addressof(obj), id}
}
);
}
int main()
{
Object<void (void)> obj1;
obj1.registerCallback(makeCallback(obj1, 42));
Object<int (float, int *, const double &)> obj2;
obj2.registerCallback(makeCallback(obj2, 777));
::std::cout.flush();
return(0);
}
Запустить в онлайн компиляторе
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости