小编Laz*_*ard的帖子

接受lambda的模板类的类型扣除

我正在尝试编写一个类,该类可以稍后调用没有参数的lambda。我期待C ++ 17类模板自变量的推导避免需要工厂函数。但是,尝试实例化对象而不指定类型失败。我可以使用工厂功能,但是我想了解为什么会这样。

我正在使用VC ++ 2017,并且已启用C ++ 17工具集。这是预期的行为吗?为什么?由于模板函数和模板类的类型推导规则不同,是否可以避免工厂函数或是否需要工厂函数?任何帮助将不胜感激。

template <typename F>
class WillInvoke
{
public:
    WillInvoke(std::decay_t<F> f) : f(std::move(f)) { }

    void CallNow() { f(); }

private:
    std::decay_t<F> f;
};

template <typename F>
WillInvoke<F> make_WillInvoke(F && f)
{
    return WillInvoke<F>(std::forward<F>(f));
}

int main()
{
    // OK
    auto w = make_WillInvoke([](){ std::cout << "Hello World"; });
    w.CallNow();

    // Won't compile
    WillInvoke w2([](){ std::cout << "Hello World"; }); // No instance of constructor matches argument list
    w2.CallNow();
}
Run Code Online (Sandbox Code Playgroud)

c++ lambda templates c++17

1
推荐指数
1
解决办法
64
查看次数

标签 统计

c++ ×1

c++17 ×1

lambda ×1

templates ×1