gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:18:08 27 4
gpt4 key购买 nike

出于教育目的,我正在制作一个类似 boost::any 的简单类,但我不知道如何访问存储的值。我可以完美地设置该值,但是当我尝试访问“holder”类中的任何成员时,编译器只是提示在它派生的类中找不到该成员。由于模板的原因,我无法将成员声明为 virtual

相关代码如下:

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 更改为返回 Datatype*,您可以返回 NULL 而不是抛出。您还没有处理 StoredValue 的先前值的内存,但我将把它留给您。

关于c++ - 访问类似于 boost::any 的类中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5004088/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com