4

私はたくさんの関数を持っているが本質的にベクトルクラスであるテンプレートクラスを持っています。bool型だけに1つの関数を追加したいと思います。

#include <vector>
template <typename T>
class reflected{
    private:
        T*dev_;
        T*host_;
        ar_size size;
        reflected<T>& operator=(reflected<T>& rhs);//do not impliment.  assign not allowed.
        reflected( reflected<T>& old);  //do not impliment. Copy not allowed.
    public:
        reflected():size(0L),dev_(NULL),host_(NULL){}
        reflected(ar_size n):size(n),dev_(NULL),host_(NULL){init();}
        reflected(const T*x,ar_size n):size(n),dev_(NULL),host_(NULL){init();set(x);}
        ~reflected();
        void init();
        void init(ar_size n);
        void init(const T*x,ar_size n);
        void set(const T * x);
        void setat(ar_index i, T x);
        const T getat(ar_size i);
        const T * devPtr();
        const T operator [](const ar_index i);
        ar_size length(){return size;}
};

リフレクトクラスの特殊なケースに関数を追加したいのですがvector<ar_index> reflected<bool>::which()、それが理にかなっている唯一のケースです。これを行うための最良の方法は何ですか。コンパイラは、which()をreflectedに追加して、bool用に定義することだけを好まないようです。

4

4 に答える 4

12

このようにクラステンプレートで定義できます

template <typename T> struct id { typedef T type; };

template <typename T>
class reflected{
    private:
        /* ... */
        vector<ar_index> which(id<bool>) { 
          /* ... */
        }
    public:
        /* ... */
        vector<ar_index> which() { return which(id<T>()); }
};

これにより、適切な定義を指定していないforを呼び出すと、コンパイル時エラーが発生whichします。reflected<T>T

于 2010-11-11T21:32:52.163 に答える
4

質問を1つだけ追加する場合は、継承と特殊化を組み合わせることができます。

template <typename T>
class reflected_base { 
    // your current 'reflected' contents go here
}; 

template <typename T>
class reflected : public reflected_base { };

template <>
class reflected<bool> : public reflected_base {
    vector<ar_index> which();
};

このアプローチの欠点は、専門分野ごとに特定の操作(デストラクタ、コピーコンストラクタなど)を再実装する必要があることです。別のオプションは次のとおりです。

template <typename T>
class specialized_reflected { };

template <>
class specialized_reflected<bool> {
public:
    vector<ar_index> which();
};

template <typename T>
class reflected : public specialized_reflected<T> {
    // your current 'reflected' contents go here
};

ただし、依存する名前の検索には潜在的な問題があります。3番目のオプション(そしておそらく私が選択するもの)は、非メンバー関数を使用することです:

vector<ar_index> which(reflected<bool>&);
于 2010-11-11T21:29:43.217 に答える
1

あなたが望むように直接行うことはできません。reflected()ただし、特殊なクラス以外のクラスを定義しないことで、同様の結果を得ることができます。次に、サポートされていないクラスで使用しようとすると、ライナーエラーが発生します。

#include <string>
#include <sstream>
using namespace std;

template<typename A>
class Gizmo
{
public:
    Gizmo(){};
    int which();    
};

template<> int Gizmo<bool>::which()
{
    return 42;
}

int main()
{

    Gizmo<bool> gb;
    gb.which();

    Gizmo<int> gi;
    gi.which(); // LINKER ERROR for Gizmo<int>which()

    return 0;
}
于 2010-11-11T21:31:37.307 に答える
0

に追加できますvector<ar_index> reflected<bool>::which()reflected<bool>一般的なテンプレートには追加できません)。エラーが発生した場合は、テンプレートの特殊化を正しく行っていない可能性があります...

于 2010-11-11T21:36:07.757 に答える