2015-10-12 3 views
0

Hello all у меня есть this пример. Обычно в этом случае я бы использовал шаблон посетителя. Однако по какой-то причине человек, который написал Base, DerivedA, DerivedB предпочитает dynamic_cast s. Имейте в виду, что я не могу изменить Base, DerivedA, DerivedB классы. У меня есть кастинг с частичной специализацией. Пожалуйста, дайте мне знать, если это хорошее решение или есть лучший вариант?Консультация по частичной специализации

#include <iostream> 
using namespace std; 

class CBase{}; 

class CDerivedA: public CBase{}; 

class CDerivedB : public CBase{}; 

class CDerivedC : public CBase{}; 

template <typename T> 
void Draw(T* face) 
{ 
    cout<<"Base"<<endl; 
} 

template <> 
void Draw<>(CDerivedA* face) 
{ 
    cout<<"A"<<endl; 
} 

template <> 
void Draw<>(CDerivedB* face) 
{ 
    cout<<"B"<<endl; 
} 

int main() { 
    CDerivedA* a = new CDerivedA(); 
    CDerivedB* b = new CDerivedB(); 
    CDerivedC* c = new CDerivedC(); 

    Draw(a); 
    Draw(b); 
    Draw(c); 

    return 0; 
} 

ответ

1

Если типы известны во время компиляции, вы можете просто использовать функцию перегрузки. Это также работает в дополнение к перегрузке базового класса (или, если необходимо, шаблон общей функции).

void Draw(CBase* face); 
void Draw(CDerivedA* face); 
void Draw(CDerivedB* face); 

Если типы известны во время выполнения, и вы не имеете возможности изменять классы (т.е. добавить виртуальные функции), вам нужно какое-то механизм диспетчеризации. Подход, который не включает в себя множество классов и код шаблона, представляет собой типы отображения таблиц для функций, например. std::map<std::type_index, std::function<void()>> или аналогичный. Это может быть не так эффективно из-за проблем с поиском и динамической доставкой.

Смежные вопросы