【发布时间】:2019-04-16 19:19:24
【问题描述】:
我正在尝试编写一个能够在以后调用不带参数的 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();
}
【问题讨论】:
-
你到底想用
std::decay_t<F>实现什么?
标签: c++ templates lambda c++17