Есть ли способ найти непосредственный базовый класс (если есть) произвольного типа класса? - PullRequest
0 голосов
/ 04 мая 2018

Я хотел бы создать объект хранения, для которого я могу установить / получить свойство различных типов в программном приложении. (Давайте просто скажем, что свойство является строкой.) Если предпринята попытка получить свойство для некоторого типа T, для которого ранее свойство не было сохранено, я хочу, чтобы свойство возвращалось для самого производного типа, который является базовым классом T. И я хотел бы все это без каких-либо особых требований к типам классов, для которых хранятся свойства.

Так что в принципе это должно выглядеть примерно так.

class Store
{
  public:
    template <class T> void put(const string& property) { /* MAGIC HERE */ }
    template <class T> string get() const { /* MORE MAGIC */ }
};

class X {};
class Y : public X {};
class Z : public Y {};

int main()
{
    Store store;
    store.put<X>("x");
    store.put<Z>("z");
    cout << store.get<X>() << endl;
    cout << store.get<Y>() << endl;
    cout << store.get<Z>() << endl;
    return 0;
}

И вывод должен выглядеть так:

x
x
z

Возможно ли это даже с C ++? Это было бы несложно с отражениями Java.

1 Ответ

0 голосов
/ 04 мая 2018

«Традиционный» способ сделать это состоит в том, чтобы просто поместить псевдоним типа в родительский класс (или классы в tuple<>) и извлечь его с помощью duck-typing.

class X {
  // can be resolved automatically with SFINAE, but having an explicit "no parent" 
  // allows to catch mistakes at compile-time more easily.
  using parent_t = void;
};

class Y : public X {
  using parent_t = X;
};

class Z : public Y {
  using parent_t = Y;
};

Это довольно незначительное количество шаблонного материала, которое редко вызывает сильное трение везде, где я видел его использование.

С тех пор, в вашем случае, реализация Store с std::unordered_map<std::type_index, std::string> довольно тривиальна.

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