1

我有五个班级,声明如下:

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

4

2 回答 2

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) { }
};
于 2013-02-05T06:46:04.150 回答
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 没有 of ,这当然会T出错。AT::type

于 2013-02-05T06:03:41.493 回答