Специализируйте класс, перегружая его, не теряя функциональности - PullRequest
1 голос
/ 14 марта 2012

Я занимаюсь разработкой простого сериализатора данных в XML для учебных целей. Теперь, когда у меня есть базовый класс сериализатора, я хочу получить специализированный сериализатор для структур данных различных проектов. Мой базовый сериализатор имеет такие функции:

class Serializer {
public:
    template <class T> void add_value(const std::string &key, T *value);
    template <class T> void add_value(const std::string &key, std::vector<T*> *value);
};

Базовый сериализатор способен обрабатывать большинство примитивных структур данных (int, double, bool и т. Д.), И есть некоторые перегрузки для нескольких более сложных структур (векторов, карт и т. Д.). Предположим, у меня теперь есть проект со следующей структурой данных:

struct MyStruct {
    int width, height;
};

Теперь я хотел бы получить сериализатор из моего базового сериализатора, который способен обрабатывать эту структуру, а также структуры, которые он уже знает:

class MyStructSerializer : public Serializer {
    void add_value(const std::string &key, MyStruct *value);
};

Проблема: после перегрузки функции add_value в дочернем классе формы родительского класса больше не доступны. Можно ли перегрузить функцию add_value как специализацию для функций, предоставляемых в родительском классе, то есть не дать дочернему классу забыть более общий метод его родителя после перегрузки?

1 Ответ

8 голосов
/ 14 марта 2012

Ключевое слово using импортирует членов базового класса в производный класс:

include <vector>
#include <string>
#include <iostream>
// Note: __PRETTY_FUNCTION__ is non-standard
#define X(x) (std::cout << __PRETTY_FUNCTION__ << "\n")
class Serializer {
public:
  template <class T> void add_value(const std::string &key, T *value)
    { X(); }
  template <class T> void add_value(const std::string &key, std::vector<T*> *value)
    { X(); }
};

struct MyStruct {
    int width, height;
};

class MyStructSerializer : public Serializer {
public:
    using Serializer::add_value;
    void add_value(const std::string &key, MyStruct *value)
      { X(); }
};

int main () {
  MyStructSerializer s;
  MyStruct ms;
  int i;
  s.add_value("Hello", &i);
  s.add_value("Hello", &ms);
}

Хотя, не проще ли специализировать Serializer::add_value, а не выводить из Serializer?Как это:

template <>
void Serializer::add_value<MyStruct>(const std::string &key, MyStruct* value)
{

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...