Есть ли в С++ возможность создать Initializer_list переменной длины?
В качестве примера:
std::list<string> mylist { somemagic (listSize, "default") };
Or:
QList<MyClass> anotherList { somemagic (listSize, {MyClassInitializerHere} ) };
Есть ли в С++ возможность создать Initializer_list переменной длины?
В качестве примера:
std::list<string> mylist { somemagic (listSize, "default") };
Or:
QList<MyClass> anotherList { somemagic (listSize, {MyClassInitializerHere} ) };
Нет, 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"));
Вы можете использовать следующее: (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>());
}
initializer_list
требуется размер времени компиляции, поэтому мое решение его сконструировать.
- person Jarod42; 10.07.2014