1.concept(概念)
作用:用于限制类型,比如函数的参数只接收某种类型(int)的
template <class T>
concept IntLimit = std::is_same_v<int, std::decay_t<T>>; //制约T塌陷后的类型必须与int相同
template <IntLimit T>
void print_int(T v)
{
std::cout << v << std::endl;
}
int main()
{
print_int(1);
print_int(1.0); //error C2672: “print_int”: 未找到匹配的重载函数
}
2.require
//限定只能调用存在name成员函数的类
class A
{
public:
std::string_view name() const { return "A"; }
};
class B
{
public:
std::string_view class_name() const { return "B"; }
};
template <typename T>
concept NameLimit = requires(T a)
{
a.name(); //制约T的实例a必须要有name成员函数
};
template <NameLimit T>
void print_name(T a)
{
std::cout << a.name() << std::endl;
}
int main()
{
A a;
B b;
print_name(a);
print_name(b); //error C2672 : “print_name”: 未找到匹配的重载函数
}
______________________________________________________________________
//限定只能调用返回值可以转换为std::string的函数
template <typename T>
concept ReturnLimit = requires(T t)
{
{t()} -> std::convertible_to<std::string> ; //函数返回值必须可以转换为std::string
std::is_function<T>; //T必须为函数
};
template <ReturnLimit T>
void print_string(T func)
{
std::cout << func() << std::endl;
}
std::string str1()
{
return "123";
}
constexpr const char* str2()
{
return "str2";
}
std::basic_string<char8_t> str3()
{
return u8"str3";
}
int main()
{
std::string t;
t = std::string_view("213");
print_string(&str1);
print_string(&str2);
print_string(&str3); //error C2672: “print_string”: 未找到匹配的重载函数
return 0;
}
本文由 Ryan 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2020/05/08 16:10