7

Vector<size>私が念頭に置いているアプリケーションは、宣言したいクラスに似たものです

CrossProduct(const Vector<size>& other)

サイズが 3 の場合のみ。ハッキングできる方法があることはわかっています...

  • size=3 の場合のみ関数定義を含める
  • 他のすべてのサイズでリンカー エラーが発生するようにする
  • メソッドの開始時に静的アサートを実行して、サイズが 3 かどうかを確認します

特定のインスタンス化のメンバー関数のみを適切に宣言する方法はありますか?

4

3 に答える 3

5

これを行う1つの方法は次のとおりです。

template <class Type, size_t Size>
struct EnableCrossProduct
{

};

template <class Type>
struct EnableCrossProduct<Type, 3>
{
  void CrossProduct(const Type & other){}
};

template <size_t Size>
struct Vector : public EnableCrossProduct<Vector<Size>, Size>
{
};
于 2013-03-20T19:57:07.613 に答える
3

コンパイル時にサイズ情報を取得できる場合は、std::enable_if を使用できます。

template<int N>
struct Vector
{
    static const int size = N;
    double data[N];
    // ...

    template<class V>
    double CrossProduct( const V& other, 
        typename std::enable_if< size == 3 && V::size == 3 >::type* = 0) const
    {
        // ...
        return 0;
    }
};

void foo( const Vector<3>& v3, const Vector<4>& v4 )
{
    v3.CrossProduct( v3 ); // Ok
    v3.CrossProduct( v4 ); // Compile-time error
}

enable_if でその条件を作りたいだけかもしれませんsize == V::size

于 2013-03-20T19:54:37.007 に答える
2

私は方法を好むでしょうstatic_assert。これ

  • 最も明確なエラーメッセージにつながります
  • SFINAE は必要ないので適切です。
  • が最も簡単な方法です。
于 2013-03-20T19:55:56.007 に答える