Вывод сигнатуры вызова лямбды или произвольного вызываемого объекта для «сделать _функцию»

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

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

В частности, я ищу тот или иной из

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

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

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


Отредактируйте :, отвечая на мой собственный вопрос.

26
задан Community 23 May 2017 в 12:33
поделиться