10
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;
}

我查看了 stl 库中累积函数的定义。这里我找到了两个宏__glibcxx_function_requires和__glibcxx_requires_valid_range,它们的定义是这样的:

#define __glibcxx_function_requires(...)
# define __glibcxx_requires_valid_range(_First,_Last)

请您向我解释一下,它们是如何工作的以及它们在做什么?

4

1 回答 1

13

什么时候_GLIBCXX_CONCEPT_CHECKS定义,这个也是。

#define __glibcxx_function_requires(...)                                 \
         __gnu_cxx::__function_requires< __gnu_cxx::__VA_ARGS__ >();

所以你发布的代码:

__glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)

解决这个问题:

__gnu_cxx::__function_requires< _InputIteratorConcept<_InputIterator> >();

其中内联到:

void (_InputIteratorConcept<_InputIterator>::*__x)() _IsUnused = &_InputIteratorConcept<_InputIterator>::__constraints;

这会强制 的实例化,它在不类似于迭代器时_InputIteratorConcept<_InputIterator>::__constraints使用typedefs 来中断编译。_InputIterator

__glibcxx_requires_valid_range根据迭代器类型,使用类似的技术来调用多个函数之一。在适当的时候(并且足够快),它会断言__last紧随其后__first

于 2013-04-10T21:00:05.013 回答