В некоторых ситуациях желательно иметь возможность стирать вызываемый (например, функцию, указатель функции, экземпляр объекта с operator()
, лямбдой, mem_fn
), например, в Использование адаптеров Boost с С++ 11 lambdas, где требуется назначаемый для копирования и стандартный по умолчанию тип.
std::function
был бы идеальным, но, похоже, нет возможности автоматически определять, какая подпись создает экземпляр класса 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; })
возвращает a std::function<int(int)>
. Очевидно, что это не должно было бы работать, если экземпляр может быть вызван более чем одной сигнатурой (например, объекты с более чем одним, шаблоном или параметром по умолчанию operator()
s).
Boost отлично, хотя предпочтительны не-Boost решения, которые не являются чрезмерно сложными.
Изменить: отвечая на мой собственный вопрос.