#define 作为缺失概念的解决方法

#define as a workaround for missing concepts

对于库实现者来说,在我们等待(希望)传入 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) { ... }

想法:

长话短说: 有几个series of courses by A. Stepanov at Amazon A9 where he uses those macro to substitute typename keyword in template parameters lists of the algorithms implemented in the classroom. Charmed by this "pointer-oriented programmer" and an old guru of all C++ libraries I started to use those macro everywhere. Recently I was pointed out that 。所以现在我正在寻找其他专家关于这种方法的建议。

有问题的库示例:标准库的 GPU 加速版本(具有高性能计算的东西,如数组结构、压缩迭代器等)、线性代数库、树状数据结构,新算法函数

您可能只想拥有一个宏,比如 CONCEPTS,并在如下代码中使用它:

#ifdef CONCEPTS
// you concept based code
#else
// your temp workaround code
#endif

这样您就可以使用构建工具(例如 makefile)来控制是否使用概念。

一个巨大的缺点是您的代码会说谎


我喜欢什么

该代码根本不使用概念,但您可以更改它以在将来使用它们if/when它们存在。

我不喜欢什么

代码根本没有使用概念,但看起来像。无法想象还有比这更危险的事情。将灌输给维护者的是多么巨大的虚假安全感!


无论如何你的想法是行不通的。当概念出现时,您将不可避免地发现您在某个地方犯了一些旧编译器不可能诊断出的错误。 您仍然需要更改代码

现在,只需像往常一样为您的类型记录 preconditions/constraints。

正如其他人所说,这听起来不是个好主意。该标准通常使用模板参数的 name 来描述它预期具有的属性。因此,例如,算法 all_of 被描述为

template <class InputIterator, class Predicate>
bool all_of(InputIterator first, InputIterator last, Predicate pred);