【问题标题】:constructor with variadic multidimensional initializer_list具有可变多维 initializer_list 的构造函数
【发布时间】:2019-07-11 07:57:04
【问题描述】:

我有以下构造函数:

class A {
    template<class ...T>
    A(std::initializer_list<T> && ... args);
}

我有那个类的代码:

A a1 = {{5.0f, 6.0f}, {-7.0f, 8.0f}};

A a2 = {{{5.0f, 3.f}, {6.0f, 7.f}}, {{-7.0f, 9.f}, {12.f, 8.0f}}};

a1 可以编译,a2 不能编译。我了解,花括号只是语法糖,默认情况下不会生成类型,只有在将其传递给带有可以使用 initilizer_list 初始化的参数的函数时(例如,std::initializer_list&lt;float&gt; 在A 和变量a1 的情况下)。

我想知道,是否有任何解决方法可以帮助将任何维度 std::initializer_list&lt;std::initializer_list&lt;std::initializer_list&lt;...&gt;...&gt;...&gt; 传递给函数/构造函数?

【问题讨论】:

  • 你为什么要这个?
  • 您不能将尺寸指定为(模板或常规)参数吗?
  • 我想将任何维度的张量解析为一维数组并同时得到它的形状。我已经对任何维度的任何类似数组的容器进行了解析,并希望为任何维度的 initializer_list 制作类似的解析器,但发现它看起来不可能。所以,我决定制作两个模板特化:template&lt;class ...T&gt; A(std::initializer_list&lt;T&gt; &amp;&amp; ... args); 和 template&lt;class ...T&gt; A(std::initializer_list&lt;std::initializer_list&lt;T&gt;&gt; &amp;&amp; ... args);,它们可以帮助我解析 3-dim 列表。够了,但我想知道是否有可能做出通用的解决方案。

标签: c++ variadic-templates initializer-list


【解决方案1】:

我检查了文档并尝试了几种不同的技巧,但它不起作用。 所以,基本的答案是不可能的。 无法使构造函数或任何其他函数接受未定义数量的大括号列表,因为大括号列表没有类型并且不能隐式转换为std::initilizer_list&lt;...&gt;。

【讨论】:

    【解决方案2】:

    std::initializer_list...>...> ,形式 必须有部分专业化,然后请参考: 如果声明了 std::initializer_list 的显式或部分特化,则程序格式错误。

    (C++17 起)

    https://en.cppreference.com/w/cpp/utility/initializer_list

    【讨论】:

    • 也许我不够清楚,但我不是在谈论 std::initilizer_list&lt;&gt; 专业化。
    猜你喜欢
    • 2015-01-31
    • 2019-06-04
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    相关资源
    最近更新 更多