c ++中是否有可能创建一个可变长度的initializer_list?
例如:
std::list<string> mylist { somemagic (listSize, "default") };
或者:
QList<MyClass> anotherList { somemagic (listSize, {MyClassInitializerHere} ) };
答案 0 :(得分:1)
不,initializer_list
只能从 braced-init-list {el1, el2, ...}
创建,其长度必须是编译时常量。
如果长度是编译时常量,那么您可以从std::index_sequence
的可变扩展构造一个braced-init-list;但是,使用std::list
的填充构造函数可能更直接:
std::list<string> mylist(listSize, "default");
您可以通过利用QList
构造函数对fromStdList
执行相同操作:
QList<string> mylist = QList<string>::fromStdList(
std::list<string>(listSize, "default"));
答案 1 :(得分: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>());
}