Jue*_*gen 7 c++ std-function generic-lambda c++14
考虑这个伪代码段:
class SomeClass
{
public:
SomeClass()
{
if(true)
{
fooCall = [](auto a){ cout << a.sayHello(); };
}
else
{
fooCall = [](auto b){ cout << b.sayHello(); };
}
}
private:
template<typename T>
std::function<void(T)> fooCall;
};
Run Code Online (Sandbox Code Playgroud)
我想要的是一个fooCall存储泛型lambda 的类成员,而lambda又在构造函数中赋值.
编译器抱怨fooCall不能是模板化的数据成员.
关于如何在类中存储泛型lambda,有没有简单的解决方案?
您无法在运行时在两个通用 lambda 之间进行选择,因为您没有用于类型擦除的具体签名。
如果您可以在编译时做出决定,则可以模板化类本身:
template <typename F>
class SomeClass
{
private:
F fooCall;
public:
SomeClass(F&& f) : fooCall{std::move(f)} { }
};
Run Code Online (Sandbox Code Playgroud)
然后您可以创建一个辅助函数来推断F:
auto makeSomeClassImpl(std::true_type)
{
auto l = [](auto a){ cout << a.sayHello(); };
return SomeClass<decltype(l)>{std::move(l)};
}
auto makeSomeClassImpl(std::false_type)
{
auto l = [](auto b){ cout << b.sayHello(); };
return SomeClass<decltype(l)>{std::move(l)};
}
template <bool B>
auto makeSomeClass()
{
return makeSomeClassImpl(std::bool_constant<B>{});
}
Run Code Online (Sandbox Code Playgroud)