C++20特性:concept

/ C++ / 没有评论 / 1773浏览

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;
}