当前位置: 首页 > 知识库问答 >
问题:

C++20概念:当模板参数符合多个概念时,选择哪个模板专门化?

漆雕修能
2023-03-14
#include <concepts>
#include <iostream>

template<class T>
struct wrapper;

template<std::signed_integral T>
struct wrapper<T>
{
    wrapper() = default;
    void print()
    {
        std::cout << "signed_integral" << std::endl;
    }
};

template<std::integral T>
struct wrapper<T>
{
    wrapper() = default;
    void print()
    {
        std::cout << "integral" << std::endl;
    }
};

int main()
{
    wrapper<int> w;
    w.print(); // Output : signed_integral
    return 0;
}

共有1个答案

孟健
2023-03-14

这是因为概念可以比其他概念更加专门化,有点像模板自己排序的方式。这称为约束的偏序

在概念的情况下,当它们包括等价的约束时,它们相互合并。例如,std::integratestd::signed_integrate是如何实现的:

template<typename T>
concept integral = std::is_integral_v<T>;

template<typename T> //   v--------------v---- Using the contraint defined above
concept signed_integral = std::integral<T> && std::is_signed_v<T>;

将约束规范化后,编译器将相反的表达式归结为:

template<typename T>
concept integral = std::is_integral_v<T>;

template<typename T>
concept signed_integral = std::is_integral_v<T> && std::is_signed_v<T>;

>

  • 析取子句pi包含合取子句qj当且仅当pi中存在原子约束pia,而qj中存在原子约束qjb,使得pia包含qjb,以及

    一个原子约束A包含另一个原子约束B,当且仅当A和B相同时,使用[temp.constr.atomable]中描述的规则。

    这描述了编译器用于排序约束的包含算法,因此也包括概念。

  •  类似资料:
    • 对于概念,提供了很好的语法,如

    • 这个问题演示了如何使用C++20概念为函数模板选择重载。我试图做一些类似的事情:为类模板选择专门化。 编译器将此附加实现视为使用不同约束对模板的重新声明。我尝试了几种不同的方式来表达我的意图,但没有一种能满足我所尝试的编译器。事实上,我甚至无法用和传统的SFINAE实现这一点--诚然,我完全有可能不太理解SFINAE。 我发现的唯一方法需要对每种整型和浮点型进行不同的专门化。 [是的,我知道还有几

    • (...)“m”不约束类型(...)

    • 有了C++20和概念,我想知道是否可以写一个概念来检查一个类型是否有一个带有特定名称的函数,该函数接受任意数量的任意参数。 以下面的代码为例(使用GCC当前的概念TS语法):

    • 本文向大家介绍dede中概念,设计和使用模板,必须要理解下面几个概念相关面试题,主要包含被问及dede中概念,设计和使用模板,必须要理解下面几个概念时的应答技巧和注意事项,需要的朋友参考一下 (1)板块(封面)模板: 指网站主页或比较重要的栏目封面频道使用的模板,一般用“index_识别ID.htm”命名,此外,用户单独定义的单个页面或自定义标记,也可选是否支持板块模板标记,如果支持,系统会用板块