c – 访问类中的值类似于boost :: any
发布时间:2020-12-16 09:32:44 所属栏目:百科 来源:网络整理
导读:我正在为教育目的制作一个简单的boost :: any-like类,但我无法弄清楚如何访问存储的值.我可以完美地设置值,但是当我尝试访问“holder”类中的任何成员时,编译器只会抱怨在派生自的类中找不到该成员.由于模板,我无法将成员声明为虚拟成员. 这是相关的代码: c
我正在为教育目的制作一个简单的boost :: any-like类,但我无法弄清楚如何访问存储的值.我可以完美地设置值,但是当我尝试访问“holder”类中的任何成员时,编译器只会抱怨在派生自的类中找不到该成员.由于模板,我无法将成员声明为虚拟成员.
这是相关的代码: class Element { struct ValueStorageBase { }; template <typename Datatype> struct ValueStorage: public ValueStorageBase { Datatype Value; ValueStorage(Datatype InitialValue) { Value = InitialValue; } }; ValueStorageBase* StoredValue; public: template <typename Datatype> Element(Datatype InitialValue) { StoredValue = new ValueStorage<Datatype>(InitialValue); } template <typename Datatype> Datatype Get() { return StoredValue->Value; // Error: "struct Element::ValueStorageBase" has no member named "Value." } }; 解决方法
将虚拟函数添加到模板中是很好的 – 只是函数本身不能是模板.模板化的类或结构仍然可以很好地具有虚函数.你需要使用dynamic_cast的魔力.
class Element { struct ValueStorageBase { virtual ~ValueStorageBase() {} }; template <typename Datatype> struct ValueStorage: public ValueStorageBase { Datatype Value; ValueStorage(Datatype InitialValue) { Value = InitialValue; } }; ValueStorageBase* StoredValue; public: template <typename Datatype> Element(Datatype InitialValue) { StoredValue = new ValueStorage<Datatype>(InitialValue); } template <typename Datatype> Datatype Get() { if(ValueStorage<DataType>* ptr = dynamic_cast<ValueStorage<DataType>*>(StoredValue)) { return ptr->Value; else throw std::runtime_error("Incorrect type!"); // Error: "struct Element::ValueStorageBase" has no member named "Value." } }; 如果更改Get以返回数据类型*,则可以返回NULL而不是throw.您还没有处理以前的StoredValue值的内存,但我要把它留给您. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |