c – 访问类中的值类似于boost :: any

c – 访问类中的值类似于boost :: any,第1张

概述我正在为教育目的制作一个简单的boost :: any-like类,但我无法弄清楚如何访问存储的值.我可以完美地设置值,但是当我尝试访问“holder”类中的任何成员时,编译器只会抱怨在派生自的类中找不到该成员.由于模板,我无法将成员声明为虚拟成员. 这是相关的代码: class Element{ struct ValueStorageBase { }; tem 我正在为教育目的制作一个简单的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值的内存,但我要把它留给您.

总结

以上是内存溢出为你收集整理的c – 访问类中的值类似于boost :: any全部内容,希望文章能够帮你解决c – 访问类中的值类似于boost :: any所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1213481.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存