能否为Eigen Tensor创建类似decltype的eval_decltype构造?
如何推导Eigen Tensor算子的自然求值类型
可行方案:利用Eigen内置的类型萃取
Eigen的Tensor表达式模板框架已经为所有算子类型提供了::PlainObject嵌套类型,这正是你要找的“自然”求值类型——它会根据表达式的维度、标量类型和存储特性,自动匹配对应的张量类型(比如TensorFixedSize、Tensor或TensorMap)。
自定义eval_decltype
你可以直接封装成你想要的形式:
template<typename TensorExpr> using eval_decltype = typename TensorExpr::PlainObject;
实际使用示例
针对你描述的场景:
// 假设func返回TensorFixedSize相关的算子表达式 auto y = func(x); // 推导求值后的自然张量类型 using Y = eval_decltype<decltype(y)>; // 完成求值并得到实际张量 Y evaluated_y = y;
更简洁的写法可以跳过自定义模板,直接使用:
decltype(y)::PlainObject evaluated_y = y;
为什么PlainObject是“自然”类型
Eigen在设计时就定义了这个类型来表示表达式求值后的默认存储形式:
- 当表达式基于
TensorFixedSize时,PlainObject会保留固定维度的模板参数,生成对应的TensorFixedSize类型 - 对于动态维度的
Tensor表达式,PlainObject是同标量类型、同维度数的Tensor - 混合类型运算(如
TensorFixedSize与TensorMap结合)会自动推导最适合的默认存储类型
针对TensorFixedSize场景的简化技巧
如果你的代码大量使用TensorFixedSize,可以用宏进一步简化求值过程:
#define EVAL_TENSOR(expr) decltype(expr)::PlainObject(expr)
使用时直接一步完成求值和类型推导:
auto evaluated_y = EVAL_TENSOR(func(x));
完全省去了显式声明复杂模板类型的麻烦。
内容的提问来源于stack exchange,提问作者dshin
相关产品推荐
相关产品推荐

