c++ - 在 C++ 中存储泛型值及其类型 : merge type+value in one class or separating them?

标签 c++ types

如果有一个当前预见到一些简单数据类型的 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/

相关文章:

c++ - 指向一个数组以获取其所有内容

c - 移位计数大于类型宽度

c++ - 错误 C2259 : 'class' : cannot instantiate abstract class

c++ - 为什么委托(delegate)或闭包通常被称为 true "object-oriented function pointers"?

c++ - 如何将函数作为参数从 C 传递给 C++,然后返回给 C

c++ - 优先队列清除方法

c# - C# 中的反射——想要一个类字段的数据类型列表

haskell - Haskell 中的函数类型特化

Java charAt 意外类型错误

python - 检查 Python 中函数/方法中参数的类型