Я хотел бы создать объект хранения, для которого я могу установить / получить свойство различных типов в программном приложении. (Давайте просто скажем, что свойство является строкой.) Если предпринята попытка получить свойство для некоторого типа 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.