C++ #定义为缺少概念的解决方法

C++ #定义为缺少概念的解决方法,c++,c++-concepts,C++,C++ Concepts,对于库实现人员来说,在等待(希望)传入宏时定义宏是一个好主意吗?这种方法的优点和缺点是什么 宏示例(由A.Stepanov编写): 用法示例(来自我): 模板 It minu元素(It first,It last){…} 这个想法: 虽然没有概念,但它是一个普通的旧模板代码 当概念最终到达时,您可以删除所有宏,或者在概念名称不同时重命名它们(您可以在任何像样的IDE中轻松完成),然后删除这些宏,或者将其重新实现为概念表达式 充分利用未来的功能,而无需重写复杂的模板化代码 即使现在,“类型化”

对于库实现人员来说,在等待(希望)传入宏时定义宏是一个好主意吗?这种方法的优点和缺点是什么

宏示例(由A.Stepanov编写):

用法示例(来自我):

模板
It minu元素(It first,It last){…}
这个想法:

  • 虽然没有概念,但它是一个普通的旧模板代码
  • 当概念最终到达时,您可以删除所有宏,或者在概念名称不同时重命名它们(您可以在任何像样的IDE中轻松完成),然后删除这些宏,或者将其重新实现为概念表达式
  • 充分利用未来的功能,而无需重写复杂的模板化代码
  • 即使现在,“类型化”模板参数也允许更好地理解代码,并为开发静态概念检查工具提供了可能
长话短说: AmazonA9上有几个by,他用这些by替换课堂上实现的算法模板参数列表中的
typename
关键字。被这个“指针导向程序员”和所有C++库的老大师所吸引,我开始到处使用那些宏。最近我被指出。所以现在我正在寻找其他专家对这种方法的建议。

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

您可能只需要一个宏,比如说
CONCEPTS
,然后在如下代码中使用它:

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

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

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


我喜欢什么

代码根本不使用概念,但是如果概念存在,您可以修改它以在将来使用它们

我不喜欢的

代码根本不使用概念,但看起来像是使用了概念。想象不出还有比这更危险的了。维护人员将会感受到一种多么巨大的虚假安全感啊


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


现在,只需像往常一样记录类型的前提条件/约束。

正如其他人所说,这听起来不是一个好主意。该标准通常使用模板参数的名称来描述其预期的属性。因此,例如,算法
all\u of
被描述为

template <class InputIterator, class Predicate>
bool all_of(InputIterator first, InputIterator last, Predicate pred);
模板
bool all_of(inputierator first,inputierator last,pred谓词);

很抱歉,问题不清楚,但我们的想法是将每个宏扩展到有意义的内容(每个概念都不同),并且不要重写代码两次。我将把这一点添加到问题中。一个很大的缺点是,这样做可以全局“保留”标识符,例如
RandomAccessIterator
等等。我在pre-concepts中见过它们,我自己也用过。如果你真的想这么做,你至少应该把它们标记为占位符
ForwardIterator\u占位符
ForwardIteratorPlaceholder
说明了它是一个自我注释,目前什么也不做,而
ForwardIterator
可能会被混淆为实际的ForwardIterator概念。
#ifdef CONCEPTS
// you concept based code
#else
// your temp workaround code
#endif
template <class InputIterator, class Predicate>
bool all_of(InputIterator first, InputIterator last, Predicate pred);