Is there in c++ a possibility to create a variable length initializer_list?
As Example:
std::list<string> mylist { somemagic (listSize, "default") };
Or:
QList<MyClass> anotherList { somemagic (listSize, {MyClassInitializerHere} ) };
Is there in c++ a possibility to create a variable length initializer_list?
As Example:
std::list<string> mylist { somemagic (listSize, "default") };
Or:
QList<MyClass> anotherList { somemagic (listSize, {MyClassInitializerHere} ) };
不,initializer_list
只能从一个花括号初始化列表 {el1, el2, ...}
创建,其长度必须是编译时常量。
如果长度是编译时常量,那么您可以从 a 的可变参数扩展构造一个花括号初始化列表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>());
}