我有一个BaseStorage
存储各种运行时数据的结构,以及一个BaseStatic
保存BaseStorage
(或派生的)typedef 和“静态”数据的结构,这些数据不会被更改并从 struct 的多个实例中读取Holder
。 Holder
有一个指向其中一个的指针,一个const BaseStatic*
用于访问该只读共享数据的指针,以及一个BaseStorage*
作为其个人信息存储的指针。中的“静态”数据BaseStatic
仍然在运行时填充(从文件中读取);它不是恒定的!
这里的想法是BaseStatic
具有一组特定的只读数据和函数,这些数据和函数将在许多Holder
实例之间 1:N 共享。每个Holder
还将具有特定于其实例的运行时信息,这些信息需要与BaseStatic
派生类型匹配。这就是BaseStorage
派生的东西所做的,它包含一个BaseStatic
类型需要的特定运行时信息。 Holder
本身也存储数据,功能在所有Holder
s中都是一样的;它不是惰性容器。
所以我需要一个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
不使用模板的情况下虚拟访问的类型?一定有更好的办法。
有各种限制导致我进行此设置,所以如果它很难看,我深表歉意。