可变长度initializer_list

Variable length initializer_list

本文关键字:list initializer      更新时间:2023-10-16

在c++中是否有创建可变长度initializer_list的可能性?

例如:

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

或者:

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

否,initializer_list只能从支持的初始化列表{el1, el2, ...}创建,其长度必须是编译时常数。

如果长度是编译时间常数,那么您可以从std::index_sequence的可变扩展中构造一个有支撑的init列表;然而,使用std::list:的填充构造函数可能更简单

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

您可以通过利用fromStdList构造函数对QList执行同样的操作

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>());
}