其他分享
首页 > 其他分享> > c – 访问类中的值类似于boost :: any

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

作者:互联网

我正在为教育目的制作一个简单的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值的内存,但我要把它留给您.

标签:derived-class,boost-any,c,oop
来源: https://codeday.me/bug/20190730/1579723.html