3

テンプレートテンプレートパラメータの次の使用を検討してください...

#include <iostream>

template <typename X>
class A
{
    X _t;
public:
    A(X t)
        :_t(t)
    {
    }
    X GetValue()
    {
        return _t;
    }
};

template <typename T, template <typename T> class C >
class B
{
    C<T> _c;
public:
    B(T t)
        :_c(t)
    {
    }
    T GetValue()
    {
        return _c.GetValue();
    }
};

using namespace std;

int main()
{
    B<int, A> b(10);
    cout<<b.GetValue();
    return 0;
}

テンプレートパラメータTを削除する方法はありますか?たとえば、次のように機能させる方法はありますか?

//Does not compile
template <template <typename T> class C >
class B
{
    C _c;
public:
    B(T t)
        :_c(t)
    {
    }
    T GetValue()
    {
        return _c.GetValue();
    }
};

int main()
{
    B< A<int> > b(10);
    cout<<b.GetValue();
    return 0;
}
4

4 に答える 4

8

コード内で A だけでなく X も使用していると思います。

いつものパターンは

template<typename C>
struct B
{
   C c;
};

そして、置換の対象となるクラス内で:

template<typename X>
class A
{
   typedef X type_name;
   X t;
};

その後、 を使用してテンプレート パラメータにアクセスできますC::type_name

于 2008-11-24T13:56:16.637 に答える
4

これは不可能です。これはよくある誤解であることに注意してください:A<int>はもはやクラス テンプレートではありません! したがって、これは template-template パラメーターには適合しませんが、型パラメーターを使用して受け入れる必要があります。

template<typename C>
struct B {
    C c;
};

B< A<int> > b;

別のパラメーターを使用する方法は問題ありません。

受け入れA<int>たいが別のパラメーターに再バインドしたい場合は、標準アロケーターでも使用されるこのパターンを使用できます。

template<typename T>
struct A {
    template<typename U>
    struct rebind {
        typedef A<U> type;
    };
};

template<typename C>
struct B {
    typename C::template rebind<float>::type c;
};

B< A<int> > b;

現在、B< A<int> >::cタイプはA<float>です。typenamebeforeは、末尾が型であり、静的な非型メンバーではないことをC::コンパイラに伝えます。afterは、::typeこれがテンプレートのインスタンス化であり、比較ではないことをコンパイラーに伝えます。templateC::rebind<float>

于 2008-11-24T13:55:40.773 に答える
1

何が問題なのですか:

template <typename C >
struct B
{
    C c;
};

int main()
{
    B< A<int> > b;
    return 0;
}
于 2008-11-24T13:55:28.603 に答える
1

パラメータをネストできます。つまり、パラメーターの値自体をパラメーター化できます。

template <typename X>
struct A
{
  X t;
};

template <typename  C>
struct B
{
  C c;
};

int main()
{
  B< A<int> > b;
  return 0;
}

この例では、binの宣言により、パラメータとしてusingmain()の特殊化が作成され、次にパラメータとしてusingの特殊化が作成されます。したがって、 の特殊化では、はです。AintBA<int>BCA<int>

于 2008-11-24T14:11:48.803 に答える