如何在Eigen C++库中获取PlainObjectBase的基础数据类型?
获取Eigen矩阵的基础数据类型(字符串形式)
要在函数中获取Eigen::PlainObjectBase对象的基础数据类型并转为字符串,可以结合Eigen的类型别名和模板特化实现,同时支持识别std::complex类型的内部基础类型。
实现思路
- 利用Eigen矩阵的
Scalar类型别名,直接获取矩阵的标量类型(比如MatrixXd的Scalar是double,std::complex<float>的Scalar就是std::complex<float>) - 通过模板特化的类型萃取类,将C++类型映射为对应的字符串描述
- 针对
std::complex<T>做单独特化,同时提取内部的基础类型信息
完整代码示例
#include <Eigen/Core> #include <string> #include <complex> #include <iostream> // 基础类型萃取模板 template<typename T> struct TypeToString { static std::string get() { return "unknown"; } }; // 针对基础数值类型的特化 template<> struct TypeToString<float> { static std::string get() { return "float"; } }; template<> struct TypeToString<double> { static std::string get() { return "double"; } }; template<> struct TypeToString<int> { static std::string get() { return "int"; } }; template<> struct TypeToString<long> { static std::string get() { return "long"; } }; // 针对std::complex的特化,提取内部基础类型 template<typename T> struct TypeToString<std::complex<T>> { static std::string get() { return "complex<" + TypeToString<T>::get() + ">"; } // 额外提供获取内部基础类型的方法 static std::string get_basic_type() { return TypeToString<T>::get(); } }; template<class Derived> void myFunction(const Eigen::PlainObjectBase<Derived>& matrix) { using ScalarType = typename Derived::Scalar; // 获取完整类型描述(包括complex标记) std::string fullType = TypeToString<ScalarType>::get(); // 获取基础数据类型(比如complex<float>返回float) std::string basicType = TypeToString<typename Eigen::NumTraits<ScalarType>::Real>::get(); std::cout << "Full type: " << fullType << std::endl; std::cout << "Basic data type: " << basicType << std::endl; } int main() { Eigen::MatrixXd A; std::cout << "=== Testing MatrixXd ===" << std::endl; myFunction(A); // 输出Full type: double; Basic data type: double Eigen::VectorXf b; std::cout << "\n=== Testing VectorXf ===" << std::endl; myFunction(b); // 输出Full type: float; Basic data type: float Eigen::Matrix<std::complex<float>, Eigen::Dynamic, Eigen::Dynamic> C; std::cout << "\n=== Testing Matrix<std::complex<float>> ===" << std::endl; myFunction(C); // 输出Full type: complex<float>; Basic data type: float return 0; }
代码说明
TypeToString模板:通过特化实现不同C++类型到字符串的映射,默认返回"unknown"处理未覆盖的类型std::complex<T>特化:不仅返回包含complex的完整类型字符串,还提供get_basic_type方法直接获取内部基础类型Eigen::NumTraits<ScalarType>::Real:Eigen提供的工具,可直接提取标量类型的实部基础类型(无论是否是complex),简化基础类型的获取逻辑- 在
myFunction中,我们同时输出了完整类型描述和基础数据类型,满足两种需求
输出结果
=== Testing MatrixXd === Full type: double Basic data type: double === Testing VectorXf === Full type: float Basic data type: float === Testing Matrix<std::complex<float>> === Full type: complex<float> Basic data type: float
内容的提问来源于stack exchange,提问作者Soo
相关产品推荐
相关产品推荐

