2014-07-10 4 views
0

Есть ли в C++ возможность создания переменной initializer_list?Variable length initializer_list

Как пример:

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

Или:

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

Просто вызовите конструктор напрямую. – Puppy

+0

, который работает только с классами с заполнением-contructr. QList, например, не имеет. – eddy

ответ

0

Вы можете использовать следующее: (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>()); 
} 
+0

для этого размер должен быть доступен во время компиляции :( – eddy

+0

'initializer_list' требует времени компиляции, поэтому мое решение для его решения. – Jarod42

1

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

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

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

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

QList<string> mylist = QList<string>::fromStdList(
    std::list<string>(listSize, "default")); 
Смежные вопросы