如何在构造函数参数中初始化`std :: set`?

时间:2018-10-06 20:28:02

标签: c++ constructor initializer-list stdset enum-class

我有一个采用std::set作为参数的构造。
如何在构造函数参数中初始化集合?

这是一个最小的概念示例。实际的实现要大得多。

#include <set>

enum class Fruits
{
    APPLE, PEACH, BANANA, STRAWBERRY, LEMON
};

class Pie
{
public:
    Pie(const std::set<Fruits>& flavors)
        : m_flavors(flavors)
    {
    }

    std::set<Fruits> m_flavors;
};

int main()
{
    // What is syntax for initialization here?
    Pie p(std::set<Fruits> {Fruits::APPLE, Fruits::BANANA});

    return 0;
}

目标是能够在参数列表中指定set的值。

使用伪代码:

Pie p({Fruits::APPLE, Fruits::BANANA});

以上内容的效果是将std::set初始化的APPLE, BANANA传递给class Pie的构造函数。

此概念将在以下代码段中使用:

class Fruit_Pie
: public Pie
{
  Fruit_Pie()
    : Pie(/* wish: {Fruits::APPLE, Fruits::LEMON}*/)
    { ; }
};

在上面的代码片段中,在调用构造函数之前创建std::set<Fruits>的实例是不切实际的。如果有办法做到这一点,我很乐意。

研究:
在Internet上搜索产生了一些示例,这些示例将std::set的实例初始化为单独的语句,而不是参数初始化。

我以前对这个概念的尝试是使用unsigned int并对初始值设定项列表中的值进行按位或运算。我正在“升级”以使用std::set

环境:
编译器:Visual Studio 2017
平台:Windows 10和Windows 7

1 个答案:

答案 0 :(得分:1)

您的伪代码是有效的C ++ 11-它正在调用std::initializer_list的{​​{1}}构造函数重载。 live example on wandbox.org