c++ - C++ 中的概念检查变化?

标签 c++ algorithm c++-concepts

我正在将一些代码从一个项目移植到公司内的另一个项目,并且遇到了一个无法编译的通用“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/

相关文章:

c++ - 使用 omp_set_num_threads() 将线程数设置为 2,但 omp_get_num_threads() 返回 1

c++ - 基于静态成员类型的模板函数特化

java - 如何从数据集中找到峰值坐标

c++ - 使用C++20 Concept约束模板参数

C++概念不好用?

c++ - struct node* node 和 struct node *node 有什么区别?

algorithm - How do a topological sort in Groovy, or an FP language 如何对列表进行排序,以便经理始终领先于下属(How do I do a topological sort in Groovy, or an FP language)

algorithm - 从两个数组中选择一对

c++ - 为什么 C++20 不支持 "void f(Concept const auto&)"?

c++ - 无法接触到在多平台 cocos2d-x 应用程序中工作