我正在编写一些通用代码,对于那些在内存中存储连续数据的人和那些不连续存储数据的人,本征代码将以不同的方式处理本征表达式。
我知道在运行时可以通过检查expr.innerSize() == expr.outerStride() && expr.innerStride() == 1
来完成此操作,但是我想知道是否可以在编译时完成?
==编辑==
此检查的目的是允许在通用代码中为表达式xpr
执行以下操作:
// c++20
if (is_linear_accessible(xpr.data(), size)) {
auto buffer = std::span(xpr.data(), size);
// work with buffer safely
// ...
} else {
auto tmp = xpr.eval();
// work with tmp.data()
// ...
}
这样,我可以将数据传递给在原始缓冲区上工作的其他库。正如@JaMiT指出的那样,由于它涉及运行时信息,因此只能在运行时完成,但是我想尽可能多地利用编译时信息来“简化”进程。
答案 0 :(得分:2)
您要查找的标志是LinearAccessBit
中的DenseBase<>::Flags
,并且正如@ggael所指出的,请确保InnerStrideAtCompileTime
等于1
。