在我们等待(希望)传入的概念时,库实现者定义宏是一个好主意吗?这种方法的优点和缺点是什么?
宏的例子(由A. Stepanov提供):
#define TotallyOrdered typename #define Pointer typename #define Number typename #define Unsigned typename #define Integral typename #define InputIterator typename #define OutputIterator typename #define ForwardIterator typename #define BidirectionalIterator typename #define RandomAccessIterator typename ...
示例用法(来自我):
templateIt min_element(It first, It last) { ... }
想法:
虽然没有概念,但这是一个简单的旧模板代码
当概念最终到达时,您可以删除所有宏或重命名它们,如果概念名称不同(您可以在任何体面的IDE中轻松完成)然后删除或只是将这些宏重新实现为概念表达式
利用未来的功能而无需重写复杂的模板化代码
即使是现在,"类型化"模板参数也可以更好地理解代码,并为开发静态概念检查工具提供了可能性
长篇故事:亚马逊A9 的A. Stepanov
有几个系列的课程,他使用这些宏来替换教室中实施的算法的模板参数列表中的关键字.由这个"面向指针的程序员"和所有C++库的老大师迷住,我开始在任何地方使用这些宏.最近我被指出宏是丑陋的(而且,迭代器有点过时,但这是另一个故事).所以现在我正在寻找其他专家对这种方法的建议.
typename
所讨论的库的示例:标准库的GPU加速版本(具有高度计算的东西,如数组结构,压缩迭代器等),线性代数库,树状数据结构,新算法函数
一个很大的缺点是你的代码会撒谎.
我更喜欢什么
代码根本不使用概念,但是如果/它们存在,您可以将其更改为将来使用它们.
我不喜欢什么
代码根本不使用概念,但看起来确实如此.无法想象比这更危险的事情.多大的虚假安全感会给维护者带来什么!
无论如何,你的想法都行不通.当概念出现时,您将不可避免地发现您在某个地方犯了一些错误,这些错误可能不会被您的旧编译器诊断出来.您仍然需要更改代码.
现在,只需记录您的类型的前提条件/约束,就像您一直以来一样.