专门化模板成员函数,以不同的方式为特殊模板类工作

时间:2015-04-25 16:49:57

标签: c++ templates template-specialization

我有两个类A类和B类它们都是A中成员函数的模板类我希望它在A的类型是B时以特殊方式行动 对于任何其他类型的正常方式,我不知道如何做到这一点?

template <class B>
class B
{
private:
  T m;
public:
  ...... any member functions
}

template <class T>
class A
{
private:
  T var;
public:
  void doSomething();
};
template <class T>
void A<T>::doSomething(){...........//implementation}
template <class T> 
void A<B<T>>::doSomething(){................//different implementation}

2 个答案:

答案 0 :(得分:0)

您可以通过这种方式专攻A

template <class T>
class A<B<T>> {
   // ...
};

这是partial template specialization的实例。

如果您拒绝对整个班级进行专业化,则可以将工作从A<T>::doSomething()推迟到部分专业化的函数doSomethingForA<T>(A &),这可能是A<T>的朋友。

答案 1 :(得分:0)

希望这可以解决您的问题:

#include <iostream>

template <typename T>
struct B {};

template <typename T> struct A;

template <typename T>
void doSomething(T&) { std::cout << "General\n"; }
template <typename T>
void doSomething(A<B<T>>&) { std::cout << "Special\n"; }

template <typename T>
struct A {
  void doSomething() {
    ::doSomething(*this);
  }  
};

int main()
{
    A<int> general;
    A<B<int>> special;
    general.doSomething();
    special.doSomething();
}