我正在将一些代码从一个项目移植到公司内的另一个项目,并且遇到了一个无法编译的通用“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++ 标准库中这些宏的名称要更改?
最佳答案
“概念”是 C++
下一版本的提议功能,但它们(相对)最近被投票排除在标准之外,因此现在不会重新出现并引用。
它们的设计目的是允许尽早检查模板参数的要求,并且除其他外,当使用不满足所需约束的类型来实例化模板时,将启用更简洁的错误消息。
第二次编辑:(请参阅 dribeas 和 Jerry Coffin 的评论)这些 g++ 宏是一种内部概念检查机制,与提议的同名新语言功能没有直接关系。由于它们是 g++ 的内部组件,您可以(也许应该)安全地删除它们,而不会丢失函数模板中的任何功能。
关于c++ - C++ 中的概念检查变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1633979/