Вывод подписи вызова лямбды или произвольного вызова для «make_function»

В некоторых ситуациях желательно иметь возможность стирать вызываемый тип (например, функцию, указатель функции, экземпляр объекта с помощьюoperator()лямбда,mem_fn), например, вИспользование адаптеров Boost с лямбдами C ++ 11 где требуется тип, назначаемый для копирования и конструируемый по умолчанию.

std::function было бы идеально, но, кажется, нет никакого способаautomatically определить, какую подпись создать экземпляр шаблона классаstd::function с. Есть ли простой способ получить сигнатуру функции произвольно вызываемой и / или обернуть ее в соответствующийstd::function экземпляр создания экземпляра (т.е.make_function шаблон функции)?

В частности, я ищу одну или другую из

template<typename F> using get_signature = ...;
template<typename F> std::function<get_signature<F>> make_function(F &&f) { ... }

такой, чтоmake_function([](int i) { return 0; }) возвращаетstd::function<int(int)>, Очевидно, что это не будет работать, если экземпляр может быть вызван с более чем одной подписью (например, объекты с более чем одним, шаблоном или параметром по умолчанию).operator()с).

Boost - это хорошо, хотя предпочтительны решения не Boost, которые не слишком сложны.

Изменить: отвечая на мой собственный вопрос.

Ответы на вопрос(3)

Ваш ответ на вопрос