0

テンプレートを使用する場合、次のことが許容されますか?

template <typename PAR1 = X,
          typename PAR2 = Y,
          typename PAR3 = Z>
class Base {
   //some stuff inside
};

template <typename PAR1
          typename PAR2 = Z>
class Derived : public Base <PAR1,Y,PAR2> {
   //some stuff here
};

ここで必要なのは、Derivedクラスは常にPAR2タイプをYにする必要があるということです。

継承中に他のパラメータがオプションである場合、パラメータ値を修正できますか?

4

2 に答える 2

1

このようなものが欲しかったと思います。だから、それは可能です

class X{};
class Y{};
class Z{};

template <typename PAR1 = X,
          typename PAR2 = Y,
          typename PAR3 = Z>
class Base {
   //some stuff inside
};

template <typename PAR1, typename PAR3>
class Derived : public Base <PAR1,Y,PAR3> {
};

int main()
{
    Derived<X, Z> d;
}

編集2:OPとは関係ありませんが、部分的な特殊化では、部分的に特殊化されたクラステンプレートパラメーターがプライマリテンプレートのデフォルト値を持っていることを知っておくとよいでしょう。

class X{};
class Y{};
class Z{};

template <typename PAR1 = X, typename PAR2 = Y, typename PAR3 = Z>
class Base {
public:
    void f() {
        std::cout << typeid(PAR1).name() << " " << typeid(PAR2).name() << " " << typeid(PAR3).name() << std::endl;
        std::cout << 1;
    }
};

template<typename PAR2, typename PAR3> class Base<X, PAR2, PAR3>
{
public:
    void f() {
        // PAR2 is by default Y and PAR3 is by default Z
        std::cout << typeid(PAR2).name() << " " << typeid(PAR3).name() << std::endl;
        std::cout << 2;
    }
};

int main()
{
    Base<X> b;   // instantiation of partially specialized template
    b.f();
}
于 2013-01-24T06:11:49.203 に答える
1

テンプレートのデフォルト値と部分的な特殊化に混乱していると思います。Baseはデフォルト値で3つのパラメーターを受け取るため、0から3のパラメーターでBaseをインスタンス化できます。

Base<> b1;              #1, PAR1=X,   PAR2=Y,   PAR3=Z
Base<int> b2;           #2  Par1=int, PAR2=Y,   PAR3=Z
Base<int, int> b3;      #3  PAR1=int, PAR2=int, PAR3=Z
Base<int, int, int> b4; #4  PAR1=int, PAR2=int, PAR3=int 

派生クラス#4では、もちろん有効な状況から継承しています。

したがって、上記の任意の形式のBaseから継承できます。

基本テンプレートパラメータは、独立したタイプ(値)にすることも、から渡すこともできますtemplate <typename PAR1, typename PAR2 = Y>

template <typename PAR1,
          typename PAR2 = Y>
class Derived : public Base <> {
};

また

template <typename PAR1,
          typename PAR2 = Y>
class Derived : public Base <PAR1> {
};

また

template <typename PAR1,
          typename PAR2 = Y>
class Derived : public Base <PAR1, PAR2> {
};
于 2013-01-24T06:27:26.897 に答える