Yoh*_*xFF 6 c++ macros stl accumulate
template<typename _InputIterator, typename _Tp, typename _BinaryOperation>
inline _Tp
accumulate(_InputIterator __first, _InputIterator __last, _Tp __init, _BinaryOperation __binary_op)
{
// concept requirements
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
__glibcxx_requires_valid_range(__first, __last);
for (; __first != __last; ++__first)
__init = __binary_op(__init, *__first);
return __init;
}
Run Code Online (Sandbox Code Playgroud)
我查看了stl库中accumulate函数的定义.在这里,我找到了两个宏__glibcxx_function_requires和__glibcxx_requires_valid_range,它们的定义如下:
#define __glibcxx_function_requires(...)
# define __glibcxx_requires_valid_range(_First,_Last)
Run Code Online (Sandbox Code Playgroud)
请你解释一下,他们是如何工作的以及他们在做什么?
何时_GLIBCXX_CONCEPT_CHECKS定义,这也是如此.
#define __glibcxx_function_requires(...) \
__gnu_cxx::__function_requires< __gnu_cxx::__VA_ARGS__ >();
Run Code Online (Sandbox Code Playgroud)
所以你发布的代码:
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
Run Code Online (Sandbox Code Playgroud)
解决这个问题:
__gnu_cxx::__function_requires< _InputIteratorConcept<_InputIterator> >();
Run Code Online (Sandbox Code Playgroud)
其中内容为:
void (_InputIteratorConcept<_InputIterator>::*__x)() _IsUnused = &_InputIteratorConcept<_InputIterator>::__constraints;
Run Code Online (Sandbox Code Playgroud)
这会强制实例化_InputIteratorConcept<_InputIterator>::__constraints,typedef当_InputIterator不类似于迭代器时,使用s来中断编译.
__glibcxx_requires_valid_range使用类似的技术来调用几个函数之一,具体取决于迭代器类型.在适当的时候(并且足够快),它将断言__last之后__first
| 归档时间: |
|
| 查看次数: |
1126 次 |
| 最近记录: |