2013-04-10 9 views
5
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; 
} 

Ho esaminato la definizione della funzione di accumulo nella libreria stl. Qui ho trovato due macro __glibcxx_function_requires e __glibcxx_requires_valid_range, definiti in questo modo:come funzionano le macro __glibcxx_function_requires e __glibcxx_requires_valid_range?

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

prega si può spiegare a me, come funzionano e che cosa stanno facendo?

risposta

5

Quando _GLIBCXX_CONCEPT_CHECKS è definito, lo è anche.

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

Quindi il codice Inviato:

__glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) 

Risolve a questo:

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

Quali inline a:

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

Ciò forza un'istanza di _InputIteratorConcept<_InputIterator>::__constraints, che utilizza typedef s per interrompere la compilazione quando _InputIterator non assomiglia a un iteratore.

__glibcxx_requires_valid_range utilizza una tecnica simile per chiamare le funzioni one of several, a seconda del tipo di iteratore. Quando appropriato (e abbastanza veloce), asserirà che __last viene dopo __first

Problemi correlati