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

标签 c++ code-organization

The c++ Programming Language 3rd Edition 中所述在第 12.2.5 节中,与使用虚函数和多态性的等效代码相比,类型字段倾向于创建通用性差、容易出错、直观性和可维护性差的代码。

作为一个简短的例子,下面是类型字段的使用方式:

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

显然,这是一场噩梦,因为向其添加一种新的形状类型和十几个类似的函数很容易出错且费力。

尽管有这些缺点和 TC++PL 中描述的缺点,是否有任何示例表明这种实现(使用类型字段)是比利用虚函数的语言特性更好的解决方案? 或者这种做法应该被列为纯粹的邪恶黑名单吗?

现实的例子比人为的例子更受欢迎,但我仍然对人为的例子感兴趣。此外,您是否曾在生产代码中看到过这种情况(即使虚函数会更容易)?

最佳答案

当您“知道”您有一组非常具体的、小的、恒定的类型时,像这样对它们进行硬编码会更容易。当然,常量不是,变量也不是,所以在某些时候您可能不得不重写整个东西。

这或多或少是在几个 Alexandrescu's articles 中用于区分 union 的技术。 .

例如,如果我正在实现 JSON库,我知道每个值只能是对象、数组、字符串、整数、 bool 值或 Null——规范不允许任何其他值。

关于c++ - 类型字段是纯粹的邪恶吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3808220/

相关文章:

c++ - 在交易客户中执行策略的正确方法是什么?

javascript - Meteor JS - 如何结合添加和编辑模板

c++ - 为 libstdc++ 生成 CTAGS(来自当前的 GCC)

c++ - 在别处实现的实例抽象类?

c++ - 遍历 JsonCpp 中的对象

go - 为什么我不能在 golang 中将 main 添加到我的库中?

c++ - 静态数据类型(结构)的组织

c++ - 在 C++ 中将默认参数设置为 nullptr 和非静态类字段

naming-conventions - 关于 View 模型的命名约定以避免长名称

python - 所有的命名元组都应该在一个单独的文件中吗?