在我们等待(希望)传入的concepts时,库实现者定义宏是一个好主意吗?这种方法有哪些优点和缺点?
宏的例子(由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
...
示例用法(来自我):
template<ForwardIterator It>
It min_element(It first, It last) { ... }
这个想法:
<子>
长篇故事:
亚马逊A9上有几个series of courses到A. Stepanov,他使用those macro替换typename
关键字替换课堂中实施的算法的模板参数列表。由这个“面向指针的程序员”和所有C ++库的老大师迷住,我开始在任何地方使用这些宏。最近我被指出macro are ugly (and, also, that iterators are kinda obsolete, but this is another story)。所以现在我正在寻找其他专家对这种方法的建议。
子>
<子> 有问题的库的例子:标准库的GPU加速版本(具有高度计算的东西,如数组结构,压缩迭代器等),线性代数库,树状数据结构,新算法函数 子>
答案 0 :(得分:6)
一个巨大的缺点是您的代码将撒谎。
我更喜欢
代码根本不使用概念,但如果/当它们存在,你可以改变它以便将来使用它们。
我不喜欢
代码根本不使用概念,但看起来像。无法想象比这更危险的事情。多大的虚假安全感会给维护者带来什么感受!
无论如何,你的想法都行不通。当概念出现时,您将不可避免地发现您在某个地方犯了一些错误,这些错误可能不会被您的旧编译器诊断出来。 您仍然需要更改代码。
现在,只需记录您的类型的前提条件/约束,就像您一直所做的那样。
答案 1 :(得分:2)
正如其他人所说,这听起来不是一个好主意。标准通常使用模板参数的名称来描述其预期具有的属性。因此,例如,算法all_of
被描述为
template <class InputIterator, class Predicate>
bool all_of(InputIterator first, InputIterator last, Predicate pred);
答案 2 :(得分:0)
你可能只想拥有一个宏,比如CONCEPTS
,并在这样的代码中使用它:
#ifdef CONCEPTS
// you concept based code
#else
// your temp workaround code
#endif
通过这种方式,您可以使用构建工具(例如 makefile)来控制是否使用概念。