如果有一个当前预见到一些简单数据类型的 union :
union Value
{
const char *str;
double d;
long l;
short s;
bool b;
void *reference;
};
union 还允许存储更复杂的数据类型(如枚举、对实例的引用等),但所有数据都存储在值 union 的一个成员中。
因为数据类型可能很复杂,Type 目前存储在一个单独的结构中,如下所示:
struct Type
{
short BaseType; // one of TYPE_STRING, TYPE_LONG, TYPE_DOUBLE, ...
char *referenceName; // only used if BaseType==TYPE_REFERENCE
Enumeration *enumeration; // only used if BaseType==TYPE_ENUMERATION
};
在重构应用程序时,我正在考虑将两个结构集成到一个类中。然后,值将成为纯接口(interface) IValue,并且每种不同类型都会有子类/实现。
Value和Type整合的缺点是Value不能再简单复制了,而总是需要clone。优点是保证您永远不会再丢失值的类型。
如果我将 Value 和 Type 保留为单独的类,我仍会将 Type 从一个结构更改为一个层次结构。 IType 将是接口(interface),对于每种类型,都会有一个子类/实现,例如StringType、DoubleType、LongType、……甚至 MyEnumType、MyOtherEnumType……然后,IType 的实现可以决定在值 union 中使用哪个值。
虽然复制类型仍然需要克隆,但我至少可以在没有克隆的情况下复制值。在大多数情况下,复制的值远多于类型。
将 Value 和 Type 分开时,整个概念是您可以根据需要多次复制 Value,但如果您想获得实际的基础值,则需要 Type。
虽然应用程序是纯 C++(没有 .Net),但我愿意使用 .Net 作为我开发的灵感,我注意到在 .Net 中你也有可以很容易地在堆栈上创建的值,通过功能的值(value),...无需克隆。
模板不是我的应用程序的解决方案,因为这会使我的应用程序大约 50% 的模板化。
问题:
- 有人使用 C++ 处理通用值和类型系统吗?
- .Net 是否具有可用作灵感的“通用”值和/或类型概念?
- 对于将 Value 和 Type 保留在单独的类中还有其他论点吗?
- 还有关于将 Value 和 Type 合并为一个类的争论吗?
最佳答案
您应该使用 boost::variant 或 boost::any。这就是他们的目的。使用它们并不意味着您必须对整个解决方案进行模板化。此外,如果您不需要类型之间的动态、运行时差异,那么这就是模板的用途。正确工作的正确工具——这是静态方差的模板,动态方差的 boost::variant。您没有必要也没有理由推出自己的动态类型系统。
.NET 的设计失败是“对象”,但如果失败了,他们也可以使用与 boost::variant 中使用的相同类型的技术,据我所知,他们的泛型足够强大,可以做那种事
关于c++ - 在 C++ 中存储泛型值及其类型 : merge type+value in one class or separating them?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4144525/