【问题标题】:power(C++ - {templates}) = power(C++)?电源(C++ - {模板})=电源(C++)?
【发布时间】:2016-04-05 15:17:56
【问题描述】:

我想知道是否可以在不使用模板的情况下在 C++ 中进行泛型编程。是否可以编写 C++ 中可用的所有库,这些库是使用模板编写的而不使用模板。 C++ 中是否有任何替代模板可用?

我想知道是否可以使用为我提供相同功能的模板对用 C++ 编写的库进行抽象

【问题讨论】:

  • 鉴于大多数标准库由模板组成,不。这就像问你是否可以做没有鸡蛋的炒鸡蛋。
  • 假设,您可以遵循 Java 方法并将所有内容都设为通用父类 ObjectCObject 类的子类/后代。实际上,这是一个不同的故事。
  • @tinlyx 但这不会为您提供相同的功能。
  • 我投票决定将此问题作为离题结束,因为这是一个愚蠢的问题。
  • @sv_jan5 我是否理解正确:您正在设计某种语言,解析器生成 C++ 代码。但它从不生成模板。每个现代 C++ 编译器(以及几乎所有不那么现代的编译器)都会编译它。问题出在哪里?

标签: c++ templates


【解决方案1】:

理论上,没有模板的 C++ 仍然是图灵完备的,因此您可以为该语言中的每个函数编写一个程序,也可以使用带有模板的 C++ 编写。据我所知,C++ 中的宏预处理器不是图灵完备的,但模板是。所以必须存在可以纯粹作为模板实现的功能,但不能用宏来实现。

实际上,我认为不可能用相同的语义重新实现所有内容。如果没有模板,您可能不得不牺牲类型安全并坚持使用宏、void* 或基于继承的方法,就像早期的 Java 类甚至对简单的容器库所做的那样。

对于更高级的元编程库,例如表达式模板、维度分析框架、Boost.Spirit Boost.Proto,我怀疑它们是否可以在没有其他形式的元编程的情况下实现。宏可能会起作用,但这更像是一个代码生成器,并将类型检查推迟到编译器,并且错误消息将比我们现在使用模板时更糟糕。此外,语义不同w.r.t参数传递。

【讨论】:

  • 为什么你的第一句话说“理论上”,好像在没有模板的情况下编写复杂的 C++ 程序是一件困难的事情,而且还没有经过多次彻底的测试?我的意思是,C 存在。
  • 我想补充一点,宏之类的模板是一种代码生成器。正如 Jens 所说,区别在于 何时 生成代码。预处理与编译,文本操作与类型检查。所以模板是高级代码生成器。
  • @BenjaminLindley 我说理论上是因为它是基于计算理论的论点。我指的不是计算表达能力或者这是否有用,尽管我确实认为通用数据类型是一个巨大的改进。
【解决方案2】:

嗯,模板就是这样 - 模板。它们是实际类型和功能的蓝图。因此,理论上,您可以手动创建所有这些模板实例化。但这不再是泛型编程了。

【讨论】:

  • 模板比这多一点,至少在 C++ 中是这样。它们是图灵完备的语言。
【解决方案3】:

问题答案:

在 C++ 中是否有任何替代模板可用?

Macroses 是模板的替代品。 (不是很好的选择,但可以选择) 相关链接[1],[2]

比较:

#define min(i, j) (((i) < (j)) ? (i) : (j))

template<class T> T min (T i, T j) { return ((i < j) ? i : j) }

宏的问题:

  • 没有类型检查,
  • 由于宏扩展,编译器错误不太容易理解
  • 多个计算表达式的副作用

关于问题:

是否可以在不使用模板的情况下编写使用模板编写的所有 C++ 中可用的库。

在某些情况下可以使用宏。可以为每种库类型编写或生成实现。但是对于用户定义的类型库不能有实现,除了宏可能有用的简单情况。 早期的纯 C(不是 C++)程序在源代码中包含特殊工具,用于在构建阶段从一些“预源”模板生成一些源代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    相关资源
    最近更新 更多