Initializer_list переменной длины

Есть ли в С++ возможность создать Initializer_list переменной длины?

В качестве примера:

std::list<string>  mylist { somemagic (listSize, "default") };

Or:

QList<MyClass>     anotherList { somemagic (listSize, {MyClassInitializerHere} ) };

person eddy    schedule 10.07.2014    source источник
comment
Просто вызовите конструктор напрямую.   -  person Puppy    schedule 10.07.2014
comment
это работает только с классами, у которых есть fill-contructr. QList например не имеет.   -  person eddy    schedule 10.07.2014


Ответы (2)


Нет, initializer_list можно создать только из списка инициализации в скобках {el1, el2, ...}, длина которого должна быть константой времени компиляции.

Если длина является константой времени компиляции, то вы можете построить список-инициализации в фигурных скобках из вариативного расширения std::index_sequence; однако, скорее всего, будет проще использовать конструктор заполнения std::list:

std::list<string>  mylist(listSize, "default");

Вы можете сделать то же самое для QList, используя функцию-конструктор fromStdList:

QList<string>  mylist = QList<string>::fromStdList(
    std::list<string>(listSize, "default"));
person ecatmur    schedule 10.07.2014

Вы можете использовать следующее: (https://ideone.com/eQstbh)

#include <initializer_list>

#if 1 // Not in C++11 // make_index_sequence
#include <cstdint>

template <std::size_t...> struct index_sequence {};

template <std::size_t N, std::size_t... Is>
struct make_index_sequence : make_index_sequence<N - 1, N - 1, Is...> {};

template <std::size_t... Is>
struct make_index_sequence<0u, Is...> : index_sequence<Is...> {};

#endif // make_index_sequence

namespace detail
{
    template <std::size_t... Is, typename T>
    std::initializer_list<T> make_initializer_list(const T& t, index_sequence<Is...>)
    {
        return { (static_cast<void>(Is), t)... };
    }
}


template <std::size_t N, typename T>
std::initializer_list<T> make_initializer_list(const T& t)
{
    return detail::make_initializer_list(t, make_index_sequence<N>());
}
person Jarod42    schedule 10.07.2014
comment
для этого размер должен быть доступен во время компиляции :( - person eddy; 10.07.2014
comment
initializer_list требуется размер времени компиляции, поэтому мое решение его сконструировать. - person Jarod42; 10.07.2014