Как реализовать список инициализаций для определенного пользователем типа? (аналог с номером инициализатора std::vector)

std::vector может быть инициализирован как

std::vector<std::string> words1 {"the", "frogurt", "is", "also", "cursed"}; 

Справка

Теперь, если вы хотите достичь аналогичной функциональности для одного из моих типов, как мне это сделать? Как реализовать конструктор для этой функции?

Как стандарт поддерживает меня в достижении этого (ссылка на стандарт будет наиболее полезной)?. В принципе, если бы вы могли научить меня, как это реализовано для std::vector этого будет достаточно.

Можно ли это сделать и до С++ 11?

Кроме того, могу ли я иметь список инициализаторов типа структуры POD, чтобы я мог иметь значения с разными типами для инициализации моего типа?

Ответ 1

Создайте конструктор, который принимает std::initializer_list как параметр:

#include <vector>
#include <initializer_list>

template <typename T>
struct foo
{
private:
    std::vector<T> vec;

public:

    foo(std::initializer_list<T> init) 
      : vec(init)
    { }
};


int main()
{
    foo<int> f {1, 2, 3, 4, 5};
}

std::vector делает это почти точно так же (хотя использование begin() и end() - std::initializer_list имеет итераторы так же, как и другие контейнеры). От gcc:

  vector(initializer_list<value_type> __l,
     const allocator_type& __a = allocator_type())
  : _Base(__a)
  {
_M_range_initialize(__l.begin(), __l.end(),
            random_access_iterator_tag());
  }

Изменить: я не на 100%, что вы пытаетесь сделать, но вы можете просто использовать единую инициализацию, чтобы получить то, что вы хотите:

struct bar
{
private:

    int i;
    double j;
    std::string k;

public:

    bar(int i_, double j_, const std::string& k_)
      : i(i_), j(j_), k(k_)
    { }

};

int main()
{
    bar b {1, 2.0, "hi"};
}