类型字段是纯粹的邪恶吗?

Jos*_*shD 4 c++ code-organization

正如在12.2.5节中的c ++编程语言第3版中所讨论的那样,类型字段倾向于创建比使用虚函数和多态的等效代码更不通用,容易出错,更不直观和更少可维护的代码.

举个简短​​的例子,下面是如何使用类型字段:

void print(const Shape &s)
{
  switch(s.type)
  {
  case Shape::TRIANGE:
    cout << "Triangle" << endl;
  case Shape::SQUARE:
    cout << "Square" << endl;
  default:
    cout << "None" << endl;
  }
}
Run Code Online (Sandbox Code Playgroud)

很明显,这是一个噩梦,因为为此增加了一种新的形状,十几种类似的功能会容易出错并且很费劲.

尽管存在这些缺点以及TC++ PL中描述的那些缺点,但是有没有这样的实例(使用类型字段)比使用虚函数的语言特性更好的解决方案?或者这种做法应该被列为纯粹的邪恶?

现实的例子比人为的例子更受欢迎,但我仍然对人为的例子感兴趣.另外,你有没有在生产代码中看到这一点(即使虚拟功能会更容易)?

小智 7

当你"知道"你有一个非常特定的,小的,不变的类型集时,就可以更容易地对它们进行硬编码.当然,常量不是,变量不是,所以在某些时候你可能不得不重写整个事情.

这或多或少是在Alexandrescu的几篇文章中用于歧视联盟的技术.

例如,如果我实现了一个JSON库,我就知道每个Value只能是一个Object,Array,String,Integer,Boolean或Null - 规范不允许任何其他值.

  • +1:一小组恒定类型的明显例子是一个不太可能快速改变的外部标准(例如,ISO标准需要很长时间才能改变,即使最好也是如此). (5认同)
  • @Steven:当然,您可以使用多态.以上内容可以让您更严格地控​​制分配(例如,您可以通过小对象优化来节省空间),并且在某些情况下可能更快.如果上面不清楚,我的Value类型就像动态语言类型中的任何其他类型一样,并且区别联合允许Value对象*动态地改变它自己的类型*.但是,是的,数组仍会模拟向量<值>和对象模型映射<String,Value>. (2认同)