Как инициализировать `std :: set` в параметре конструктора?

У меня есть конструкция, которая принимает параметр 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> перед вызовом конструктора нецелесообразно. Если есть способ сделать это, я открыт для этого.

Исследование:
В результате поиска в Интернете появились примеры инициализации экземпляра std::set как отдельного оператора, а не инициализации параметров.

Моя предыдущая попытка этой концепции состояла в том, чтобы использовать unsigned int и побитовое ИЛИ значения в списке инициализаторов. Я был «обновлен», чтобы использовать std::set .

Среда:
Компилятор: Visual Studio 2017
Платформа: Windows 10 и Windows 7

Всего 1 ответ


Ваш псевдокод действителен. C ++ 11 - вызывает перегрузку std::initializer_list конструктора std::set . живой пример на wandbox.org


Есть идеи?

10000