【发布时间】:2010-11-10 12:37:51
【问题描述】:
如果有一个当前可以预见一些简单数据类型的联合:
union Value
{
const char *str;
double d;
long l;
short s;
bool b;
void *reference;
};
联合还允许存储更复杂的数据类型(如枚举、对实例的引用等),但所有数据都存储在值联合的成员之一中。
由于数据类型可能很复杂,因此 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
};
在重构应用程序时,我正在考虑将两个结构集成到一个类中。然后,Value 将成为纯接口 IValue,并且每种不同类型都有子类/实现。
将 Value 和 Type 结合起来的缺点是 Value 不能再简单地复制了,它总是需要被克隆。这样做的好处是保证你永远不会丢失值的类型。
如果我将 Value 和 Type 保留为单独的类,我仍然会将 Type 从一个结构更改为层次结构。 IType 将是接口,并且对于每种类型都会有一个子类/实现,例如StringType, DoubleType, LongType, ... 甚至 MyEnumType, MyOtherEnumType, ... IType 的实现可以决定在 Value union 中使用哪个值。
虽然复制类型仍然需要克隆,但我至少可以在没有克隆的情况下复制值。而且在大多数情况下,复制的值比类型多得多。
当保持 Value 和 Type 分开时,整个概念是您可以根据需要多次复制 Value,但如果您想获得实际的基础值,则需要 Type。
虽然应用程序是纯 C++(没有 .Net),但我愿意使用 .Net 作为我开发的灵感,而且我注意到在 .Net 中,您还可以轻松地在堆栈上创建值,通过对函数的价值,...无需克隆。
模板不是我的应用程序中的解决方案,因为这会使我大约 50% 的应用程序模板化。
问题:
- 有使用 C++ 处理通用值和类型系统的经验吗?
- .Net 是否具有可用作灵感的“通用”值和/或类型概念?
- 还有更多关于将 Value 和 Type 保留在不同类中的论据吗?
- 还有更多用于将 Value 和 Type 合并为一个类的参数吗?
【问题讨论】:
-
你考虑过使用 boost::variant 吗?