繁体   English   中英

转置模板参数包

[英]Transpose template parameter pack

我想将行主参数列表传递给 constexpr 构造函数并将数据存储在列主数组中。 我必须将模板参数包从行优先转换为列优先,我想出的唯一方法是使用这样的临时数组:

template <typename T, std::size_t rows, std::size_t cols = rows>
class Matrix final
{
public:
  std::array<T, cols * rows> m; // column-major matrix

  template <typename ...A>
  constexpr Matrix(const A... args) noexcept:
    m{transpose(std::array<T, rows * cols>{args...}, std::make_index_sequence<rows * cols>{})}
  {}

  template <std::size_t ...i>
  constexpr auto transpose(const std::array<T, cols * rows> a,
                           const std::index_sequence<i...>) noexcept
  {
    return std::array<T, cols * rows>{a[((i % rows) * cols + i / rows)]...};
  }
};

我想没有其他方法可以无序访问参数包中的元素,但也许有一种方法可以在没有中间数组的情况下做到这一点。

要在不删除功能的情况下显着提高调试版本的性能,您需要将std::array替换为更基本的无功能版本:

https://quick-bench.com/q/FS2cphByJEWMFMsquI_Yor8ZnyI

结果版本 (ChangedArrayBasic) 比 Clang 12.0、-O0、libstdc++ 上的原始版本快约 2.8 倍。

不得使用索引运算符,因为它在实践中似乎在很大程度上无法优化,而是需要手动访问内部数组。

template <class T, size_t N>
struct BasicCustomArray
{
  T d[N];
};

template <typename T, std::size_t rows, std::size_t cols = rows>
class NewMatrixBasic final
{
public:
  using Arr = BasicCustomArray<T, cols * rows>; // <-----------------------------
  Arr m; // column-major matrix

  template <typename ...A>
  constexpr NewMatrixBasic(const A... args) noexcept:
    m{transpose(Arr{args...}, std::make_index_sequence<rows * cols>{})}
  {}

  template <std::size_t ...i>
  constexpr auto transpose(const Arr a,
                           const std::index_sequence<i...>) noexcept
  {
    return Arr{a.d[((i % rows) * cols + i / rows)]...}; // <---------------------
  }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM