Вывод подписи вызова лямбды или произвольного вызова для «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, которые не слишком сложны.
Изменить: отвечая на мой собственный вопрос.