为模板添加requires表示此模板对于其模板参数的一些要求,requires 之后是一个常量表达式,当此表达式为true时,模板函数被选用
有几种等价的写法,如下:
#include <iostream>
#include <concepts>
using namespace std;
template<typename T>
concept HAS_P = requires(T x)
{
x.p();
};
template<HAS_P T>
void test1(T t)
{
t.p();
}
template<class T>
requires HAS_P<T>
void test2(T t)
{
t.p();
}
template<class T>
void test3(T t) requires HAS_P<T>
{
t.p();
}
class A{
public:
void p()
{
cout<<"this is A::p"<<endl;
}
};
int main()
{
test1(A());
test2(A());
test3(A());
return 0;
}
运行程序输出:
this is A::p
this is A::p
this is A::p
也可以直接使用表达式:
#include <iostream>
#include <concepts>
using namespace std;
template<typename T>
requires is_integral<T>::value && same_as<T, int> //只允许是int类型
T add(T a, T b