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

我假设您在代码中关注 X 和 A。

通常的模式是有

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<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>typenamebeforeC::告诉编译器最后::type是类型而不是静态非类型成员。templateafterC::告诉编译器这是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的声明main()创建了一个Ausingint作为参数的特化,然后它创建了一个BusingA<int>作为参数的特化。因此,在 的专业化中BCA<int>

于 2008-11-24T14:11:48.803 回答