我在公司内部将一些代码从一个项目移植到另一个项目,但遇到了一个无法编译的通用“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++ 标准库中被更改了?