【发布时间】:2020-05-11 22:00:14
【问题描述】:
我有以下在其构造函数中接受 lambda 的类
template<typename MAPPER>
class MapHead {
protected:
MAPPER mapper_;
public:
MapHead(MAPPER mapf)
: mapper_(mapf) {}
template<typename IN>
auto call(IN input) -> decltype(mapper_(input)) {
return mapper_(input);
}
};
这个类的目的是保存 lambda 以进行惰性求值。我像这样测试它
auto node = MapHead([](int a) {
^-- Error here
return (uint32_t) a * 2;
});
int value = 2;
EXPECT_EQ(4, node.call(value));
在使用 gcc 和 C++ 14 编译代码时,我在标记处出现错误,提示“使用类模板 'MapHead' 需要模板参数”。
由于 lambda 没有命名类型,我无法手动为其提供模板参数,如 MapHead<LambdaType>。
切换到 C++17 时,代码会编译,因为 C++17 会自动从 lambda 推导模板类型。但我看到人们在 C++0x 中使用 lambda 作为函数参数,如 this answer 中所述。
我的问题是:切换到 C++17 是解决此问题的唯一方法吗?还是我缺少什么?
【问题讨论】:
-
C++0x 具有自动函数模板类型推导。 C++17增加了自动class模板类型推导。