power(C ++ - {templates})= power(C ++)?

时间:2016-04-05 06:45:56

标签: c++ templates

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

嗯,模板只是 - templates 。它们是实际类型和功能的蓝图。因此,理论上,您可以手动完成所有这些模板实例化。但那不再是通用编程。

答案 2 :(得分:1)

回答问题:

  

C ++中是否有可用于模板的替代方法?

宏可以替代模板。 (不是很好的选择,但替代方案) 相关链接[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 ++)程序在源代码中包含了一些特殊工具,这些工具在构建阶段用于从某些“presource”模板生成一些源。