gpt4 book ai didi

c++ - 如何给结构一个 "virtual"typedef?

转载 作者:太空宇宙 更新时间:2023-11-04 13:59:35 24 4
gpt4 key购买 nike

我有一个存储各种运行时数据的结构 BaseStorage 和一个包含 BaseStorage(或派生的)typedef 的结构 BaseStatic和“静态”数据,这些数据不会被更改并从结构 Holder 的多个实例中读取。 Holder 有一个指向其中一个的指针,一个 const BaseStatic* 用于访问只读的共享数据,一个 BaseStorage* 作为其个人信息存储。 BaseStatic 中的“静态”数据仍然在运行时填充(从文件读取);它不是恒定的!

这里的想法是 BaseStatic 有一组特定的只读数据和函数,这些数据和函数将在许多 Holder 实例之间以 1:N 的比例共享。每个 Holder 还将具有特定于其实例的运行时信息,需要匹配 BaseStatic 派生类型。这就是 BaseStorage 派生的东西所做的,它包含 BaseStatic 类型需要的特定运行时信息。 Holder本身也存储数据,并且具有所有Holder之间相同的功能;它不是惰性容器。

所以我需要一个派生的 BaseStorage 与每个派生的 BaseStatic 配对。将会有许多这样的派生对。

struct BaseStorage
{
int something[2];
};

struct BaseStatic
{
typedef BaseStorage Storage;

//members and stuff
};


struct DerivedStorage : public BaseStorage
{
std::string somethingelse;
};

struct DerivedStatic : public BaseStatic
{
typedef DerivedStorage Storage;

//other things
};


struct Holder
{
const BaseStatic* base;
BaseStorage* storage;
};

我有一个构建器函数可以做一些事情,其中​​包括填充存储。我能想到的唯一方法是使用模板,如下所示:

template<typename T> Holder& builder(const T* base) //receives a BaseStatic
{
Holder& holder = ...;

//add to a list, etc

holder.base = base;
holder.storage = new T::Base();
}

然而,这将导致编译器为一件非常微不足道的事情(访问单一类型!)生成大量模板化函数。此外,我的 T::Base 构造函数永远不能有参数(除非所有结构都具有相同的参数!)。我敢肯定这在其他方面也很糟糕。

有没有什么方法可以在不使用模板的情况下存储可以从 BaseStatic 虚拟访问的类型?一定有更好的方法。

有多种限制导致我采用此设置,所以如果它难看,我深表歉意。

最佳答案

模板并不像您想象的那么糟糕。任何多态解决方案都可能需要某种 RTTI 使用,这将需要比较和间接分支——可能比一堆模板化函数更昂贵或更便宜,并且根据您的要求,这可能是坏的、好的或更有可能是无意义的。请记住,只有一个模板将根据一组唯一的模板参数实例化,因此在您的情况下每个基本 T 只能实例化一个模板。

构造函数问题的一个解决方案是使用 C++11 可变参数模板参数:

template<typename T, typename ...Args> 
Holder builder(const T* base, Args ...args) //receives a BaseStatic
{
Holder holder;

//add to a list, etc

holder.base = base;
holder.storage = new typename T::Storage(args...);
return holder;
}

请注意,要使其正常工作,派生的存储类型必须使用 BaseStorage 的私有(private)继承,否则 Storage typedef 会变得不明确。

现在这可能会分解成很多功能,具体取决于您的项目范围,但请记住——“先不要优化。”

关于c++ - 如何给结构一个 "virtual"typedef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19819406/

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