模板怪异

时间:2013-02-05 05:58:29

标签: c++ templates

我有五个课程,声明如下:

template <typename T>
class A {
    void fn(X);
};
template <typename T>
class B {};
class C {};
class D {};
class X {};

我声明了两个实例:

A<B<C>> abc;
A<B<D>> abd;

如何对fn进行模板化,以便必须使用abc.fn()C类型的对象与abd.fn()类型的对象调用D?< / p>

2 个答案:

答案 0 :(得分:3)

你可以像这样对你的班级进行部分专业化:

template <typename T> class A;
template <typename T> class B {};

template <typename T>
class A<B<T> > {
  public:
    void fn(T) { }
};

class C {};

class D {};

int main(int,char**)
{
  A<B<C>> abc;
  A<B<D>> abd;
  abc.fn(C());
  abd.fn(D());
  return 0;
}

如果您希望它适用于任何模板,而不仅仅是B,您可以像这样部分地专门化A类:

template <typename T,template <typename> class U>
class A<U<T> > {
  public:
    void fn(T) { }
};

答案 1 :(得分:2)

这不会太漂亮。

template <typename T>
class B {public: typedef T type;};

template <typename T>
class A {
    void fn(typename T::type X);
    //void fn(...){}  // would prevent an error if T does not have type.
};

基本上,您将类型保存在typedef中,然后在A中使用它。如果B T的{​​{1}}没有A,那么这肯定会出错。