gpt4 book ai didi

c++ - 从非模板接口(interface)中检索 'generic' 数据

转载 作者:搜寻专家 更新时间:2023-10-31 02:19:13 25 4
gpt4 key购买 nike

目标是为数据创建一个通用容器,这让我可以:

std::vector<GenericContainer> containerList = {"foo", 1.4f, 10, 'a'};

我写了下面的代码*:

struct GenericContainer
{
template <typename DataType>
GenericContainer(DataType && data) :
_base(new Derived<DataType>(std::forward<DataType>(data)))
{ }

// operates with the data
void func()
{
_base->func();
}

struct Base
{
virtual void func() = 0;
virtual ~Base() = default;
};

template <typename T>
struct Derived : public Base
{
Derived(T && data) :
_data(std::forward<T>(data))
{}

void func() override
{
process(_data);
}

T _data;
};
Base * _base;
};

这里的process可以是一个自由函数,方便地为每个类型定义。

void process(const float& f) { /**/ } 
void process(const int& i) { /**/ }
// ...

我的问题:有没有一种优雅的方法可以从 GenericContainer 恢复原始类型的数据?(不使用 stringstream 之类的东西来处理数据)。

我的猜测是,它可以通过将 functor 的某种模板 struct 传递给 GenericContainer 来完成,但我被困在这点。

*代码灵感来自this article .

最佳答案

一个 C++ 对象可以在类似值的上下文中存储任何类型的数据,并且如果您提供完全相同的类型就可以将其取出,类似于 boost::any .

boost::any是类型删除的一个例子,你“忘记”了关于一个类型的许多细节,只记得某些操作。在any的情况下,即复制、销毁和转换回相同类型。

在你的情况下,除了process,你已经忘记了一切。并销毁。

运行时概念是该技术的另一个名称。

boost::variant是另一种方法,它存储类型列表中的一个,并提供“访问”所包含数据的方法。因为它知道它存储的类型列表,所以它可以对传入的函数对象进行类型检查,并确保它们可以使用存储的每个数据的类型。然后在运行时它可以选择调用哪一个。


一般来说,如果您启用了 RTTI(许多编译器会为您提供删除它的选项),添加“cast-back-to-same-type”相对容易。在您的情况下,只需执行 dyanmic_cast在容器上到 Derived<T> , 那么如果可行就得到 _data包含在其中。这样的转换通常应该承认失败。

如果您知道您希望出现的类型(或类型列表),这可以让您将其取回。如果您不知道类型,则只能运行您在构造时删除的代码。理论上,类型删除数据可能来自完全独立于要在该类型上运行的代码编写的 DLL;并且 C++ 不会为每个可执行文件提供编译器。

顺便说一句,你的 GenericContainer(DataType && data)有危险的签名;你正在做转发引用,所以这可能意味着你的 GenericContainer最终可能会存储对 DataType 的引用。通常类型应该是值语义或引用语义;让类型在它们之间静默切换会导致意外行为。


template<class T>
T* as() {
auto* d = dynamic_cast<Derived<T>*>(_base);
if (!d) return nullptr;
return std::addressof(d->_data);
}
template<class T>
T const* as() const {
auto const* d = dynamic_cast<Derived<T>*>(_base);
if (!d) return nullptr;
return std::addressof(d->_data);
}

上述方法将启用GenericContainer c; int* i = c.as<int>(); , 和 i是 nullptr 当且仅当 c 没有 int

关于c++ - 从非模板接口(interface)中检索 'generic' 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33760279/

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