【问题标题】:Variable length initializer_list可变长度初始化器列表
【发布时间】:2014-07-10 12:41:30
【问题描述】:

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

例如:

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

或者:

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

【问题讨论】:

  • 直接调用构造函数即可。
  • 这仅适用于具有填充构造的类。 QList 例如没有。

标签: c++ default-value initializer-list variable-length


【解决方案1】:

不,initializer_list 只能从 braced-init-list {el1, el2, ...} 创建,其长度必须是编译时常量。

如果长度是编译时常量,那么您可以从 std::index_sequence 的可变参数展开构造一个花括号初始化列表;但是,使用std::list 的填充构造函数可能更直接:

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

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

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

【讨论】:

    【解决方案2】:

    您可以使用以下内容:(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 需要编译时大小,所以我的解决方案是构建它。
    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多