本文介绍了C ++ 14:具有通用std :: function的通用lambda作为类成员的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请考虑以下伪代码片段:

Consider this pseudo-snippet:

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;
};

我想要的是班级成员 fooCall

编译器抱怨 fooCall 不能被编译。

The compiler complains that fooCall cannot be a templated data member.

关于如何将通用lambda存储在类中,是否有任何简单的解决方案?

Is there any simple solution on how i can store generic lambdas in a class?

推荐答案

在运行时,您将无法在两个通用lambda之间进行选择,因为您没有具体的签名来进行类型擦除。

There is no way you'll be able to choose between two generic lambdas at run-time, as you don't have a concrete signature to type-erase.

如果可以在编译时做出决定,则可以对类本身进行模板化:

If you can make the decision at compile-time, you can templatize the class itself:

template <typename F>
class SomeClass
{
private:
    F fooCall;

public:
    SomeClass(F&& f) : fooCall{std::move(f)} { }
};

然后您可以创建一个辅助函数来推断 F

You can then create an helper function to deduce 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>{});
}

这篇关于C ++ 14:具有通用std :: function的通用lambda作为类成员的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-19 20:20