#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) { ... }
想法:
- 虽然没有概念,但它是一个普通的旧模板代码
- 当概念最终出现时,如果概念名称不同,您可以删除所有宏或重命名它们(您可以在任何体面的地方轻松地做到这一点 IDE),然后删除或只是将这些宏重新实现到概念表达式中
- 利用未来的功能而无需重写复杂的模板代码
- 即使是现在,"typed" 模板参数也有助于更好地理解代码并开启开发静态概念检查工具的可能性
长话短说:
有几个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);
对于库实现者来说,在我们等待(希望)传入 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) { ... }
想法:
- 虽然没有概念,但它是一个普通的旧模板代码
- 当概念最终出现时,如果概念名称不同,您可以删除所有宏或重命名它们(您可以在任何体面的地方轻松地做到这一点 IDE),然后删除或只是将这些宏重新实现到概念表达式中
- 利用未来的功能而无需重写复杂的模板代码
- 即使是现在,"typed" 模板参数也有助于更好地理解代码并开启开发静态概念检查工具的可能性
长话短说:
有几个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);