【发布时间】:2011-08-03 14:12:28
【问题描述】:
我一直坚持为 lambda 专门设计一个模板函数:
class X
{
public:
template <typename T>
void f(T t)
{
std::cout << "awesome" << std::endl;
};
template <>
void f(double t)
{
std::cout << "trouble" << std::endl; // Works
}
template <>
void f(??? t) // what to put here?
{
std::cout << "lambda" << std::endl;
}
};
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"
在传递给 f 并专门针对这种类型之前将 lambda 转换为 std::function 是可行的,但编写起来很乏味。 C++0x有解决办法吗?
编辑:我完全可以接受一个解决方案,如果传递 lambda 的最后一行有效,这将使我能够专注于可调用对象。
【问题讨论】:
-
因此答案似乎是:不,在 C++0x 中没有办法避免强制转换并专门用于匹配 lambdas 的模板。
-
如前所述 (stackoverflow.com/questions/4661875/…),无法将 lambda 函数与其他可调用对象区分开来
标签: templates lambda c++11 template-specialization