Есть ли в C ++ возможность создать initializer_list переменной длины?
Как пример:
std::list<string> mylist { somemagic (listSize, "default") };
Или же:
QList<MyClass> anotherList { somemagic (listSize, {MyClassInitializerHere} ) };
Нет, initializer_list
может быть создан только из приготовился-INIT-лист {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"));
Вы можете использовать следующее: (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>());
}