Шаблонная специализация с полиморфизмом - PullRequest
0 голосов
/ 02 октября 2011

Я хочу вызвать специализированную шаблонную функцию, используя указатель на ее базовый тип. Я не уверен, если это возможно, поэтому я открыт для предложений и / или альтернатив. Вот пример моей ситуации:

class CBase {};
class CDerivedClass : public CBase {};

template<class T>
int func<T>(T &x) { ... };

template<>
int func<CDerivedClass>(CDerivedClass &x) { ... };

У меня есть другая функция, которая управляет списком указателей CBase, а затем вызывает функцию func ().

void doStuff()
{
    CBase *foo[10] = { ...... };

    for (int i = 0; i < 10; ++i)
        func(*foo[i]);
}

Есть ли способ получить производный тип, чтобы вызывался func (CDerivedClass &)?

Ответы [ 3 ]

1 голос
/ 03 октября 2011

А как насчет Шаблон подклассов ?Эта идиома позволяет вам использовать полиморфизм времени компиляции в C ++.Стоимость этого - более высокая детализация (например, указание всей иерархии классов до текущего класса).В вашем случае:

template <typename TSpec> class Klass {};

template <typename TSpec> struct SpecTag {};
template <typename TSpec> class Klass<SpecTag<TSpec> > {};

template <typename TSpec>
int func(Klass<TSpec> &x) { ... };

template <typename TSpec>
int func(Klass<SpecTag<TSpec> > &x) { ... };
0 голосов
/ 02 октября 2011

В этом случае на помощь приходит шаблон «Посетитель».Это позволяет полиморфное поведение в алгоритме, реализованном вне класса.Некоторый код поддержки требуется внутри класса, но позже могут быть добавлены новые алгоритмы, изменены существующие алгоритмы и т. Д., Не влияющие на класс.

0 голосов
/ 02 октября 2011

Альтернативное решение: из вашего примера очевидно, что вам просто нужно использовать виртуальный метод в CBase, поэтому вам просто нужно определить виртуальную функцию в CBase и переопределяющую функцию в производном классе.

...