Насколько я могу судить, это невозможно.
Спасибо Игорю-Тандетнику за указание на то, что не существует такого понятия, как специализация шаблона функции;Есть только перегрузки функций.
Так что, когда дело доходит до этого, я пытаюсь перегрузить шаблон функции другим шаблоном функции с таким же количеством аргументов.Именно здесь шаблоны + разрешение перегрузки попадают в бермудский треугольник вычета / разрешения.https://en.cppreference.com/w/cpp/language/function_template#Function_template_overloading. Возможно в конце концов пройти, но предоставить кому-либо еще карту того, как вы туда попали, тоже довольно сложно, и удобство чтения кода + удобство обслуживания.
Лучший способ различить эти дваРеализация - это SFINAE и некоторые дополнительные черты типа, но C ++ 11 не предоставляет никаких черт типа для идентификации лямбда-выражений, что позволило бы мне самому определить класс черты. PW указал, что тип лямбды является объектом замыкания.Это делает определение класса черт типа для идентификации лямбда-выражений (или даже функторов произвольных аргументов) довольно сложной задачей.
Я пытался, но не получилось.В случае, если это кому-нибудь пригодится, я поделюсь тем, что попробовал.Может быть, кто-то еще может найти решение:
// Give myself a default-defined is_callable trait that is false_type
template< typename T, typename enable=void > struct is_callable: public std::false_type {};
//specializations for callable types:
// functors and lambdas
template< typename T, typename ...arg_t >
struct is_callable< decltype(T::operator(arg_t...)) >: public std::true_type {};
Опять же, это не сработало.Это ошибка компиляции, и я не совсем понял, можно ли вообще ссылаться на оператор с аргументами.Следующие перегрузки do , кажется, делают то, что я хочу ...
// functions
template< typename T >
struct is_callable< T, typename std::enable_if< std::is_function<T>::value >::type >: public std::true_type {};
// std::function
template< typename ret_t, typename ...arg_t >
struct is_callable< std::function<ret_t(arg_t...)> >: public std::true_type {};