[英]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.