Eigen線形代数ライブラリ(リンク)のテンプレート化されたMatrixクラスを使用しています。Matrixクラスは、3つの名目上のテンプレートパラメーターを取ります。
Matrix<type, rows, cols>
上記では、の例は、、type
またはdouble
ですstd::complex<double>
。また、rows
は行数、cols
は行列の列数です。
以下のコードに示されているように、私がやりたいのは、条件付きステートメントを使用して、実行時に別のテンプレート化された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ポインターを使用する必要はありません。