Как инициализировать `std :: set` в параметре конструктора? - PullRequest
0 голосов
/ 06 октября 2018

У меня есть конструкция, которая принимает 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 Ответ

0 голосов
/ 06 октября 2018

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

...