2

通常の 1 つに対して 2 つのパラメーターを取るテンプレートの特殊化を行うにはどうすればよいですか? 私はポインタークラスを構築していましたが、配列を作成するために拡張することを考えましたが、次のようなことを試してみると:

template<class T,int s> class pointer{};
template<class T> class pointer{};

class mama{};
int main(){
    pointer<mama> m;
}

エラーが発生します。テンプレート... 1 つのパラメーターで再宣言されました。

pointer<mama,10>size() と operator[] があるのに対しpointer<mama>、そうではなく、operator-> と * があるため、特殊化する必要があります。

4

3 に答える 3

8

配列ケースの一般的なテンプレートを作成できます。

template <class TElem, int size = 0>
class pointer
{
    // stuff to represent an array pointer
};

次に、部分的な特殊化:

template <class TElem>
class pointer<TElem, 0>
{
    // completely different stuff for a non-array pointer
};

size=0 の場合に特化したバージョンを定義することで、実際にはまったく異なる実装を同じ名前で与えることができます。

ただし、別の名前を付けた方がわかりやすいかもしれません。

于 2009-05-26T22:21:41.263 に答える
3

コードにクラス テンプレートの再宣言があり、コンパイル時にエラーが発生します。デフォルトのテンプレート引数とテンプレート テンプレート パラメータを使用できます。

template<class T,int s=10> class pointer{};

class mama{};
int main(){
    pointer<mama> m;
}

ポインターには size() と operator[] がありますが、ポインターにはありませんが、operator-> と * があるため、特殊化する必要があります。

クラスに別のデザインが必要なようです。テンプレートの特殊化が進むべき道であるかどうかはわかりません。問題の外観から、特性に基づいて専門化することを本当に考えるべきです。

于 2009-05-26T22:17:20.930 に答える
2

2 番目のパラメーターのデフォルト値を設定できます。おそらく次のようになります。

template <class T, int N=0>
class moo {
        T *foo;
public:
        moo() {
                if (N > 0) {
                        foo = new T[N];
                }
                else
                {
                        foo = new T;
                }
        }
};
于 2009-05-26T22:08:54.550 に答える