如何用模板统一实现Eigen复矩阵、向量及复数的共轭操作?
模板化统一处理Eigen矩阵与std::complex的共轭操作
方案1:重载辅助函数实现(兼容C++11及以上)
通过定义适配不同类型的共轭辅助函数,再封装模板化的bc函数,实现代码复用:
#include <complex> #include <Eigen/Core> // 适配Eigen矩阵/向量类型:调用成员函数conjugate() template <typename Derived> auto do_conjugate(const Eigen::MatrixBase<Derived>& mat) { return mat.conjugate(); } // 适配std::complex类型:调用std::conj() template <typename T> std::complex<T> do_conjugate(const std::complex<T>& c) { return std::conj(c); } // 统一逻辑的模板bc函数 template <typename T> T bc(int sign, T in) { return sign == -1 ? do_conjugate(in) : in; }
方案2:constexpr if分支判断(C++17及以上)
如果项目支持C++17,可直接在模板函数内通过编译时类型判断分支处理:
#include <complex> #include <Eigen/Core> #include <type_traits> template <typename T> T bc(int sign, T in) { if (sign != -1) { return in; } if constexpr (std::is_same_v<T, std::complex<double>>) { return std::conj(in); } else { // 匹配所有Eigen矩阵/向量类型 return in.conjugate(); } }
说明
两种方案都能彻底消除重复代码:
- 方案1通过重载机制自动匹配不同类型的共轭实现,兼容性更广;
- 方案2利用C++17的编译时分支特性,代码结构更紧凑。
调用时无需区分传入的是Eigen矩阵、向量还是std::complex<double>,也不需要额外中间结构或.value()调用。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

