社内のあるプロジェクトから別のプロジェクトにコードを移植しているときに、コンパイルされない一般的な「sets_intersect」関数に遭遇しました。
template<typename _InputIter1, typename _InputIter2, typename _Compare>
bool sets_intersect(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2, _InputIter2 __last2,
_Compare __comp)
{
// Standard library concept requirements
// These statements confuse automatic indentation tools.
// concept requirements
__glibcpp_function_requires(_InputIteratorConcept<_InputIter1>)
__glibcpp_function_requires(_InputIteratorConcept<_InputIter2>)
__glibcpp_function_requires(_SameTypeConcept<
typename iterator_traits<_InputIter1>::value_type,
typename iterator_traits<_InputIter2>::value_type>)
__glibcpp_function_requires(_OutputIteratorConcept<_OutputIter,
typename iterator_traits<_InputIter1>::value_type>)
__glibcpp_function_requires(_BinaryPredicateConcept<_Compare,
typename iterator_traits<_InputIter1>::value_type,
typename iterator_traits<_InputIter2>::value_type>)
while (__first1 != __last1 && __first2 != __last2)
if (__comp(*__first1, *__first2))
++__first1;
else if (__comp(*__first2, *__first1))
++__first2;
else {
return true;
}
return false;
}
私はこの「概念」の概念に慣れていないので(駄洒落で申し訳ありません)、c ++標準ライブラリを少し調べてグーグルで調べたところ、これらの__glibcpp_function_requires
マクロがに変更されたことがわかります__glibcxx_function_requires
。これでコンパイラエラーが修正されました。ただし、これは私にとって初めてのことなので、このコードが私のために何をしているかに興味があり、ライブラリ内のドキュメントを見つけたり、コードを解読したりするのに問題があります。
これらのマクロのポイントは、コンパイラがテンプレート化された関数を展開すると、コンパイル時に型チェックを実行して、使用されているコンテナがこのアルゴリズムと互換性があるかどうかを確認することだと思います。つまり、最初の呼び出しは、に_InputIter1
準拠するチェックであると想定してい_InputIteratorConcept
ます。私は混乱しているだけですか、それとも正しい方向に進んでいますか?また、これらのマクロの名前がc ++標準ライブラリで変更されたのはなぜですか?