使用专门用于特定类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;
}
专业实施
一般实施
换句话说,我希望两个输出为:
专业实施
专业实施
答案 0 :(得分:3)
在C ++ 11中,您可以使用std::enable_if
和std::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_c
和boost::is_base_of
或std::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_if
与boost::is_base_of
结合使用时,可以实现此目的。