c++ - 使用 C++20 Concept 约束模板参数
问题描述
我想使用概念来替换当前使用 SFINAE (enable_if) 的设计。为了简化,我创建了一个更简单的示例,它显示了一个相同的问题:
template<typename T>
concept smallerThanPointer = sizeof(T) < sizeof(void*);
template<typename T>
concept notSmallerThanPointer = !smallerThanPointer<T>;
template<smallerThanPointer T>
class MyClass
{
public:
MyClass() { std::cout << "MyClass[smallerThanPointer]\n"; }
};
template<notSmallerThanPointer T>
class MyClass
{
public:
MyClass() { std::cout << "MyClass[...]\n"; }
};
int main()
{
MyClass<int[8]> c1;
return 0;
}
但是我的编译器(g++-11)不会接受这种语法,因为它认为我在重新声明MyClass
. 这个例子也是不可能的:
template<typename T>
class MyClass requires smallerThanPointer<T>
{
public:
MyClass() { std::cout << "MyClass[smallerThanPointer]\n"; }
};
template<typename T>
class MyClass
{
public:
MyClass() { std::cout << "MyClass[...]\n"; }
};
我在网上找到的所有带有概念的示例仅讨论如何将概念应用于函数参数。那么有可能与班级有关吗?
解决方案
约束的部分模板特化的正确语法应该是:
template<typename T>
concept smallerThanPointer = sizeof(T) < sizeof(void*);
template<class T>
class MyClass
{
public:
MyClass() { std::cout << "MyClass[...]\n"; }
};
template<class T> requires smallerThanPointer<T>
class MyClass<T>
{
public:
MyClass() { std::cout << "MyClass[smallerThanPointer]\n"; }
};
推荐阅读
- c# - 我的代码有什么问题?显示未处理的异常:System.IO.FileNotFoundException
- java - 可以将枚举添加到 Jackson 注释类吗?
- php - 从开始 ipv6 和结束 IPv6 计算 IPv6 范围
- http - 如何限制 Go Transport 中的 keep-alive TTL?
- python - 是否有任何内置函数可以在 Python 中获取负整数的二进制格式?
- json - 将正确的 json 对象分配给类
- json - 如何解析以下字符串2数组
- c - 欧拉项目第58题,错误在哪里
- database - 如何使用 mongoDB 找到没有评分或评论的电影的标题
- java - 无法在 EC2 实例上远程调试 Java