C++ 14:具有通用std :: function作为类成员的泛型lambda

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,有没有简单的解决方案?

Vit*_*meo 4

您无法在运行时在两个通用 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)