使用派生类作为参数的专用模板方法

时间:2012-01-12 15:16:19

标签: c++ templates polymorphism

使用专门用于特定类A的模板方法,有没有办法为从A派生的类调用专用代码?

最小的例子

#include <iostream<  

class A
{};

class B : public A
{};

class Templator
{
public :
    template <class T>
    void dance(T *argument);
};

template <class T>
void Templator::dance(T *argument)
{
    std::cout << "General implementation" << std::endl;
}

template<>
void Templator::dance<A> (A* )
{
    std::cout << "Specialized implementation" << std::endl;
}

int main()
{
    A a;
    B b;

    Templator tt;
    tt.dance(&a);
    tt.dance(&b);

    return 0;
}

对应输出

  

专业实施
  一般实施


换句话说,我希望两个输出为:

  

专业实施
  专业实施

3 个答案:

答案 0 :(得分:3)

在C ++ 11中,您可以使用std::enable_ifstd::is_base_and_derived

class Templator{
public :
    template <class T>
    typename std::enable_if<!std::is_base_and_derived<A, T>::value, void>::type 
    dance(T *argument) { 
       std::cout << "General implementation" << std::endl;
    }
    template <class T>
    typename std::enable_if<std::is_base_and_derived<A, T>::value, void>::type 
    dance(T *argument) { 
       std::cout << "Specialized implementation" << std::endl;
    }
};

您可以使用boost::enable_if_cboost::is_base_ofstd::tr1::is_base_of在C ++ 03中执行相同的操作并自己编写enable_if(请参阅here)< / p>

答案 1 :(得分:1)

您只需将&b投射到A*

如果您更改此代码

tt.dance(&a);
tt.dance(&b);

到此代码

tt.dance(&a);
tt.dance((A*)&b);

输出变为

Specialized implementation
Specialized implementation

答案 2 :(得分:1)

boost::enable_ifboost::is_base_of结合使用时,可以实现此目的。