Есть ли лучший способ сделать это?
Да, этот дизайн немного лучше, поскольку он использует статическую диспетчеризацию при вызове GetValue()
(я предполагаю, что dynamic_cast
это опечатка, вы на самом деле хотели набрать static_cast
в Base::GetValue()
).В этом варианте Base::GetValue()
не является виртуальным, но он может вызывать Derived::GetValue()
, используя указатель типа Base
.Это делает его немного быстрым.
Но даже ваш путь не так уж и плох.Все, что вам нужно для создания шаблонов ваших классов, вот так:
Search<int,int> *s = new XMLSearch<int, int>();
Ваш Search *s = new XMLSearch<int, int>()
является неправильным !
Вы можете typedef
ваши шаблоныследующим образом:
typedef Search<int,int> iisearch;
typedef XMLSearch<int,int> iixmlsearch;
Затем используйте их:
iisearch *s = new iixmlsearch();
Это выглядит лучше, верно?
Небольшая модификация
Вы можетесделать ваш класс немного лучше с точки зрения производительности.Для этого напишите свой шаблон класса поиска следующим образом:
template <typename InputType, typename ResultType> class Search {
public:
void search (InputType input) //it's not virtual anymore!
{
xmlsearch *_this = getXmlSearch();
xmlsearch->search(input);
}
void getResult(ResultType& result) //it's not virtual anymore!
{
xmlsearch *_this = getXmlSearch();
xmlsearch->getResult(result);
}
private:
typedef XMLSearch<InputType, ResultType> xmlsearch;
xmlsearch* getXmlSearch()
{
static xmlsearch *_this= static_cast<xmlsearch* >(this);
return _this;
}
};
Теперь ваш базовый класс не является абстрактным, поскольку он не определяет виртуальные функции.Этот дизайн немного быстрее, чем ваша версия!