【问题标题】:Append to std::array附加到 std::array
【发布时间】:2016-12-30 15:39:24
【问题描述】:

由于我找不到这样的函数(不正确?),我正在尝试创建一个编译时函数 (constexpr) 函数,它采用 std::array<T,n> arrT t 并返回一个新的std::array<T,n+1>t 添加到 arr 的末尾。我是这样开始的:

template <typename T, int n>
constexpr std::array<T,n+1> append(std::array<T,n> a, T t);

template <typename T>
constexpr std::array<T,1> append(std::array<T,0> a, T t)
{
  return std::array<T,1>{t};
}

template <typename T>
constexpr std::array<T,2> append(std::array<T,1> a, T t)
{
  return std::array<T,2>{a[0], t};
}

我在这里卡住了。我需要的是一种在初始化列表的第一个 n 位置扩展 a 的方法,然后添加 t 添加末尾。那可能吗?或者有其他方法吗?

【问题讨论】:

    标签: c++ arrays c++11


    【解决方案1】:

    当然有可能:std::index_sequence&lt;I...&gt; 是你的朋友!您只需分派到一个函数,该函数以合适的 std::index_sequence&lt;I...&gt; 作为参数并使用所有值扩展包。例如:

    template <typename T, std::size_t N, std::size_t... I>
    constexpr std::array<T, N + 1>
    append_aux(std::array<T, N> a, T t, std::index_sequence<I...>) {
        return std::array<T, N + 1>{ a[I]..., t };
    }
    template <typename T, std::size_t N>
    constexpr std::array<T, N + 1> append(std::array<T, N> a, T t) {
        return append_aux(a, t, std::make_index_sequence<N>());
    }
    

    【讨论】:

    • 哇,对我来说简直是魔法!近年来,C++ 确实取得了长足的进步。谢谢!
    • 值得补充的是,对于 c++11,integer_sequence 有可用的有效实现,例如this one 不幸的是它不是开箱即用的。
    • @kalj:实际上,并没有什么魔力。也许这对我来说很自然,因为我发布了this answer,这导致了相关的proposal。 ;-)
    • @DietmarKühl,如果这很神奇,那么答案对我来说就是纯粹的巫术。不过有很多很酷的东西要学!
    • 好的,稍作修改即可使用。结果N 必须是std::size_t,还有一个小错字,append 应该返回一个大小为N+1 的数组。您可能需要更新此内容。
    【解决方案2】:

    很容易将 Dietmar 的答案扩展到一个可以让您对两个数组进行 constexprcatenate 的工具:

    // constexpr util to catenate two array's.
    //
    // Usage:
    //
    // constexpr std::array<int, 2> a1 = { 1, 2 };
    // constexpr std::array<int, 2> a2 = { 3, 4 };
    //
    // constexpr auto a3 = catenate_array(a1, a2);
    
    template <typename T, std::size_t N, std::size_t M, std::size_t... I, std::size_t... J>
    constexpr std::array<T, N + M>
    catenate_array_aux(std::array<T, N> a1, std::array<T, M> a2, std::index_sequence<I...>, std::index_sequence<J...>) {
        return std::array<T, N + M>{ a1[I]..., a2[J]... };
    }
    
    template <typename T, std::size_t N, std::size_t M>
    constexpr std::array<T, N + M> catenate_array(std::array<T, N> a1, std::array<T, M> a2) {
        return catenate_array_aux(a1, a2, std::make_index_sequence<N>(), std::make_index_sequence<M>());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多