2013-04-10 3 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; 
} 

私はstlライブラリの蓄積関数の定義を調べました。 は、ここで私はこのように定義されている2つのマクロ__glibcxx_function_requiresと__glibcxx_requires_valid_range、実測値:__glibcxx_function_requiresマクロと__glibcxx_requires_valid_rangeマクロはどのように機能しますか?

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

あなたは私を説明することができますしてください、彼らは仕事と、彼らが何をしているのか?

答えて

5

_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> >(); 

:これは、使用している、_InputIteratorConcept<_InputIterator>::__constraintsのインスタンス化を強制的に

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

がイテレータに似ていない場合、コンパイルを中断するにはが必要です。

__glibcxx_requires_valid_rangeは、イテレータタイプに応じて、one of several関数を呼び出すのと同様の手法を使用します。適切な場合(そして十分に速い場合)、__lastは、__firstの後に来ると主張します。

関連する問題