Ниже приведен вариант старого доброго размера трюка.Может быть, это можно сделать только с помощью decltype.Он точно не проверяет, является ли это лямбда, но может ли он быть вызван.Если вы хотите отфильтровать другие вызываемые объекты, вы можете использовать признаки типа C ++ 0x, чтобы проверить, являются ли они функциями, функциями-членами, составными объектами и т. Д.
#include <functional>
#include <iostream>
#include <type_traits>
template<class T>
char is_callable( const T& t, decltype( t())* = 0 );
long is_callable( ... );
class X
{
public:
template <typename T>
void f( const T& t, typename std::enable_if<sizeof(is_callable(t)) !=1>::type* = 0 )
{
std::cout << "awesome" << std::endl;
};
void f(double )
{
std::cout << "trouble" << std::endl; // Works
}
template<class T>
void f( const T& t, typename std::enable_if<sizeof(is_callable(t)) == 1>::type* = 0 )
{
std::cout << "lambda" << std::endl;
}
};
int main(int argc, const char *argv[])
{
X x;
x.f(42); // prints "awesome"
x.f(1.12); // prints "trouble"
x.f([](){ std::cout << "my lazy lambda" << std::endl; }); // should print "lambda"
}