【发布时间】:2012-12-06 21:19:36
【问题描述】:
我正在使用 Eigen 线性代数库 (link) 中的模板化 Matrix 类。 Matrix 类采用三个名义模板参数:
Matrix<type, rows, cols>
在上面,type 的示例是double 或std::complex<double>。另外,rows是行数,cols是Matrix的列数。
如下面的代码所示,我想做的是在运行时使用条件语句使用不同的模板化 Matrix 类。
想到的第一个解决方案可能是使用 void 指针。
#include <iostream>
#include <Eigen/Dense>
#include <complex>
using namespace Eigen;
int main()
{
// this flag is set at run-time, but it is only set here
// in the code as an example
int create_complex = 1;
void *M;
if(create_complex)
{
Matrix<std::complex<double>,3,3> m0;
M = &m0;
}
else
{
Matrix<double,3,3> m0;
M = &m0;
}
// de-reference pointer here and use it
return 0;
}
虽然此代码可以编译,但 void *M 指针需要在使用前显式取消引用。这很不方便,因为我必须为相同的程序逻辑编写不同的代码块。
我想知道这里是否可以应用类似于多态性的东西,我不必使用 void 指针。
【问题讨论】:
-
create_complex标志在编译时是未知的。我只是以create_complex为例。 -
您介意使用
boost::variant吗?我会非常努力地避免陷入您的境地(也许更多的背景知识会帮助我们帮助您),但如果必须,我会接受。 -
@AlexandreC.:当然,我想使用
boost::variant。我以前使用过 boost 库,但我不能说我听说过那个特定的容器。这似乎很有趣。我该如何使用它? -
Boost 变体将允许您定义一种可以存储任一 Matrix
或Matrix , n, m> 的类型.这样,您就不需要指向 void 的指针。同样,可能有更好的方法来编写代码。 -
谢谢,Alexandre C. Boost 变体确实非常好。万岁提升!
标签: c++ templates pointers eigen