Как вы заставляете шаблонизацию соответствовать базовому классу?

У меня есть функция шаблона, который явно создан для Base класс, но не для Derived учебный класс. Как я могу заставить использования, которые передают Derived класс (или другие производные классы) для сопоставления с Base учебный класс?

Заголовочный файл:

class Base {
};
class Derived : public Base {
};
class Derived2 : public Base {
};

template <typename Example> void function(Example &arg);

Файл реализации:

// Explicitly instantiate Base class:
template void function<Base>(Base &arg);

// Define the template function:
template <typename Example> void function(Example &arg) {
  // Do something.
}

Потому что у меня нет явно созданной функции для Derived или же Derived2Я получаю неопределенные ссылки, однако я хотел бы связать с Base класс, который явно определен.

Как я могу заставить шаблон преобразоваться в базовый класс для всех объектов, производных от Base с использованием C++-03?

Могу ли я сделать это как-то со специализацией Derived класс к Base определение класса?

1 ответ

Решение

Как насчет:

template <> void function(Derived &arg)
{
     function<Base>( arg );
}

РЕДАКТИРОВАТЬ: Вы также можете сделать это с перегрузкой функции, как предложил aschepler:

void function(Derived &arg)
{
     function<Base>( arg );
}

Концептуально то же самое, хотя, я согласен, немного лучше:)

Другие вопросы по тегам