使用lambda作为构造函数参数是否需要C++ 17?

使用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

我有一个在其构造函数中接受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);
        }
    };

我在标记中出错,使用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);