c ++:调用派生类的重载函数作为参数(没有显式转换)

时间:2011-06-06 14:32:52

标签: c++ casting overloading

想象一下以下场景:

    template<class T>
    void myFunction(T *)
    {
       //do nothing
    }

    void myFunction(myBase * _base)
    {
       //do something with _base
    }

int main( int argc, const char* argv[] )
{
    myDerivedFromBase * ptr = new myDerivedFromBase;
    myFunction(ptr); //calls the templated version

    myFunction(static_cast<myBase*>(ptr)); //calls the correct version

    delete ptr;
}

基本上我想实现模板化函数被调用指针,而不是从我的基础派生的。如果ptr是从myBase派生的,我希望在没有显式强制转换的情况下调用myFunction的第二个版本。那可能吗?

2 个答案:

答案 0 :(得分:6)

使用类型特征来阻止模板绑定:

template<typename T>
typename std::enable_if<!std::is_base_of<myBase, T>::value, void>::type myFunction(T*)
{
}

如果你不能使用C ++ 0x,请使用Boost的类型特征库。

答案 1 :(得分:-1)

如果你可以使用指向基础的指针(见下文),你可以使用模板专业化:     #包括     使用namespace std;

class myBase {};
class myDerivedFromBase: public myBase {};

template<class T>
void myFunction(T *)
{
   cout << "Most general function." << endl;
}

template<>
void myFunction(myBase * _base)
{
   cout << "Specialized for myBase." << endl;
}

int main( int argc, const char* argv[] )
{
    myDerivedFromBase * ptr = new myDerivedFromBase;
    myFunction(ptr); 
    delete ptr;

    myBase* bptr = new myBase;
    myFunction(bptr);
    delete bptr;

    bptr = new myDerivedFromBase;
    myFunction(bptr);
    delete bptr;
}