5

マトリックスコードに ublas を使用していますが、交換可能にしたいので、これを行っていました:

typedef boost::numeric::ublas::matrix<double> cMatrix;

今日、このマトリックスのいくつかを制限付きのサイズに変更する必要があるため、これも用意します。

typedef boost::numeric::ublas::bounded_matrix<double, 3, 3> Matrix3d;

問題は、私の古い関数宣言:

void cClass::function(int param1,
                      int param2,
                      cMatrix &param3,
                      int param4);

動作しなくなりました。それは私に与えます:

error : a reference of type "cMatrix &" (not const-qualified) cannot be initialized with a value of type "Matrix3d"

宣言を次のように変更することで、なんとか修正できました。

template <class A>
void cClass::function(int param1,
                      int param2,
                      boost::numeric::ublas::matrix<double, boost::numeric::ublas::row_major, A> &param3,
                      int param4);

問題は、私の定義が cpp ファイルであるため、cpp で次のようにする必要があることです。

void dummyFunc()
{
  cClass dummy(NULL, NULL);
  cMatrix c;
  Matrix12d d12;
  dummy.function(-1, -1, c, -1);
  dummy.function(-1, -1, d12, -1);
}

dummyFunc を実行したり、他の方法で関数を一般化したりするのを避ける方法はありますか?

4

2 に答える 2

1

matrixとがまったく同じ API を持っている場合bounded_matrix、型を抽象化し、cClass::function可変個引数テンプレートを使用して一般化できます。

template<template <class...> class M, class... Arg>
void cClass::function(int param1,
                      int param2,
                      M<Arg...> &param3,
                      int param4);
于 2013-03-21T19:16:50.503 に答える
1

Thibautの(正しい)回答に対するこの改善を提案します:

template<class UblasMatrix, typename /*Dummy*/ = UblasMatrix::array_type>
void cClass::function(int param1,
                      int param2,
                      UblasMatrix &param3,
                      int param4);

SFINAE のおかげで、2 番目のテンプレート引数は、関数をある種の ublas 行列で呼び出すことを (ほぼ) 確実にするためのものであり、他のもの (たとえば、 としましょうstd::vector<doubel>) ではありません。これにより、混乱を招くエラー メッセージが回避されます。

于 2013-06-06T10:45:12.070 に答える