1

いくつかの線形代数問題でベクトルと固定/動的割り当てを処理するために、次のクラスを作成しました(変更したくない):

// Traits : n is the size of the vector, if -1 : dynamic allocation
template<typename RealType, int n = -1>
struct ClassAVectorTraits
{
  typedef typename LinearAlgebraLibrary::FixedSizeVector<RealType, n> type;
};

template<typename RealType>
struct ClassAVectorTraits<T, -1>
{
  typedef typename LinearAlgebraLibrary::DynamicSizeVector<RealType> type;
};

template<typename RealType>
struct ClassAVectorTraits<T, 1>
{
  typedef typename RealType type;
};

// Implementation
template<typename RealType, int n = -1>
struct ClassA
{
  typedef typename ClassAVectorTraits<RealType, n>::type vector;

  void doSomething( const vector& vec )
    {
      ...
    }
};

さらに、私はインターフェースクラスを持っています(私はそれを変更することができます):

template<typename RealType, int n = -1>
struct UserClass
{
  typedef typename ClassAVectorTraits<RealType, n>::type vector;

  ClassA ca;

  void doSomething( const vector& vec )
    {
      ca.doSomething( vec );
    }

};

ここで、ユーザーがLinearAlgebraLibraryベクトルの代わりにSTLベクトルを入力で指定できるようにしたいので、次のようにしました。

// A class to do automatic conversion
template<typename RealType, int n = -1>
struct Field : public ClassAVectorTraits<RealType,n>::type
{
  // Constructor NOT explicit
  Field( const std::vector<RealType>& vec )
    {
      // Copy vec into this (a LinearAlgebraLibrary vector)
    }
}

template<typename RealType>
struct Field<RealType, 1> { }; // Can't derive from integral type : RealType !

// And to classes to tag the solution 
template<typename RealType, int n>
struct USE_LINEAR_ALGEBRA_LIBRARY
{
  typedef typename ClassAVectorTraits<RealType,n>::type vector;
};

template<typename RealType, int n>
struct USE_STL
{
  typedef typename Field<RealType,n> vector;
};

そして最後に :

template<typename RealType, int n = -1, class VectorTag = USE_LINEAR_ALGEBRA_LIBRARY<RealType, n> >
struct UserClass
{
  typedef typename VectorTag::vector vector;

  ClassA ca;

  void doSomething( const vector& vec )
    {
      ca.doSomething( vec );
    }

};

したがって、USE_STLタグを使用すると、自動変換が行われます。

UserClass<double, 2, USE_STL<double, 2> > userClass;
std::vector<double> vecSTL(2, 12.0);

userClass.doSomething( vecSTL ); // vecSTL is converted to LinearAlgebraLibrary::FixedSizeVector<double, 2>

私の質問n=1:ベクトル型が積分型である場合にどう対処できますか?double(size == 1)のSTLベクトルと?の間の暗黙の変換をどのように定義できますdoubleか?

助言がありますか ?ありがとう。

4

1 に答える 1

0

専門化しようとしているときに、ジェネリックテンプレートのスキームに従う必要はありません。お役に立てれば:

template<typename RealType>
struct Field<RealType, 1> { 
   typename ClassAVectorTraits<RealType,1>::type value;
   operator ClassAVectorTraits<RealType,1>::type () const { return value; }
   Field(const std::vector<RealType>& vec) 
   {
       if (vec.size() == 1) value = vec[0];
       else throw runtime_error("wrong size");
   }
}; 
于 2012-06-24T07:33:22.663 に答える