【问题标题】:How to assign variadic template arguments to std::array如何将可变参数模板参数分配给 std::array
【发布时间】:2020-02-24 04:21:39
【问题描述】:

我有一个std::array,我有一个可变参数模板函数,其参数数量与数组的大小相匹配。我需要将参数分配给数组的元素。换句话说,在下面的代码中我希望a 获取值{1, 2, 3}b 获取值{1, 2, 3, 4, 5}

std::array<int, 3> a;
std::array<int, 5> b;

assign_values(a, 1, 2, 3);
assign_values(b, 1, 2, 3, 4, 5);

问题是如何实现assign_values可变参数模板函数。

我受限于 C++14 版本。

更新: 参数可以是不同的类型:assign_values(b, 1, 2u, 3., '4', 5l);

【问题讨论】:

  • 我很困惑:如果你可以使用 C++14,为什么这会被标记为 C++11?
  • @Chipster 这只是意味着我可以使用 C++11 但不能使用 C++17。我的问题中没有特定于 C++14 的内容。
  • 知道了。不过我的事情是,由于大多数 C++ 版本都是向后兼容的,最好将您可以用作标签的最新版本放在哪里?这只是我的思考过程。不过,您当然不必这样标记它。

标签: c++11 variadic-templates


【解决方案1】:

这样的:

template<class T, size_t N, class ... Values>
void assign_values(std::array<T,N>& arr, Values... vals) {
    static_assert(N == sizeof...(vals));
    int j = 0;
    for (auto i : std::initializer_list< std::common_type_t<Values...> >{vals...})
        arr[j++] = i;
}

Demo

【讨论】:

  • 甚至 `void assign_values(std::array& arr, Values... vals) { arr = {vals...}; }
  • @Kit。是的,你的解决方案也更好更简单:)
  • @rafix07 这个解决方案不是通用的。您提供泛型类型Values,但只迭代整数:for (int i : {vals...})
  • @rafix07 还有一个复杂情况:在您的 sn-p 中,所有 Values 都是整数(至少它们属于同一类型)。如果我们使用不同的类型(即使是那些不丢失精度的)怎么办? assign_values(b, 1, 2u, 3., '4');
  • @DmitryKuzminov 初始化器列表必须具有一种类型的所有值。所以你可以使用common_type_t 来推断它。然后你可以在输入参数包中混合浮点数、整数、字符。
【解决方案2】:

我受限于 C++14 版本

未使用的数组初始化的好老技巧(模板折叠的 C++17 前代理)应该有效(也适用于 C++11)

template <typename T, std::size_t N, typename ... Values>
void assign_values (std::array<T,N> & arr, Values... vals)
 {
    static_assert(N == sizeof...(vals));

    using unused = int[];

    int j = 0;

    (void)unused { 0, (arr[j++] = vals, 0)... };
 }

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多