使用lambda作为构造函数参数是否需要C++ 17?
我有一个在其构造函数中接受lambda的类使用lambda作为构造函数参数是否需要C++ 17?,c++,templates,lambda,C++,Templates,Lambda,我有一个在其构造函数中接受lambda的类 template<typename MAPPER> class MapHead { protected: MAPPER mapper_; public: MapHead(MAPPER mapf) : mapper_(mapf) {} template<typename IN> auto call(IN inp
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);
}
};
我在标记中出错,使用GC+用C++ 14编译代码时,使用类模板“MpHead”需要模板参数。p> 由于lambda没有命名类型,我无法手动为它提供像MapHead这样的模板参数
切换到C++17时,代码会编译,因为C++17会自动从lambda中推断模板类型。但我看到人们在C++0x中使用lambda作为函数参数,如中所述我的问题是:切换到C++17是解决这个问题的唯一方法吗?或者我缺少什么?c++17之前没有类模板参数推断,因此必须指定模板参数 不是很漂亮,但这很有效:
auto lambda = [](int a) {
return (uint32_t) a * 2;
};
auto node = MapHead<decltype(lambda)>(lambda);
您可以将其包装在工厂函数中以获得参数推断。C++0x具有自动的函数模板类型推断。C++17添加了自动类模板类型推断。谢谢。这是可行的,但是在C++ 17下,它看起来更优雅。我会接受你的回答。顺便说一下,如果代码编译得好,所有的测试用例都通过了,我有没有理由升级到C++ 17?我认为你应该总是使用你能使用的最新版本。如果没有理由支持旧的C++标准,就不支持它们。
auto lambda = [](int a) {
return (uint32_t) a * 2;
};
auto node = MapHead<decltype(lambda)>(lambda);