c ++: вызовите перегруженную функцию для производных классов в качестве аргументов (без явного приведения) - PullRequest
2 голосов
/ 06 июня 2011

Представьте себе следующий сценарий:

    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 ]

6 голосов
/ 06 июня 2011

Используйте черты типа для предотвращения привязки шаблона:

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

Если вы не можете использовать C ++ 0x, используйте вместо этого библиотеку черт типа Boost.

0 голосов
/ 06 июня 2011

Если вы можете использовать указатель на базу (см. Ниже), вы можете использовать специализацию шаблона: #include using 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...