c++ - 可以使用概念来限制值和类型吗?
问题描述
概念可用于将类型约束作为模板参数,如下例所示:
template<typename t, int v>
concept the_concept1 = sizeof(t) > v;
template<int v, the_concept1<v> t>
struct some_struct1{};
我正在尝试使用类似的方法,其值如下例所示:
template<int v1, int v2>
concept the_concept2 = v1 > v2;
template<int v1, the_concept2<v1> v2>
struct some_struct2{};
但是使用 G++ 10 我收到以下错误消息:
error: ‘the_concept2’ does not constrain a type
所以我想知道是否可以使用概念来限制值?如果是这样,那我该怎么做?
编辑:我的最终目标是在模板结构的声明中使用这个概念,其中包含可变参数模板参数,例如:
template<typename t, std::size_t ... v>
struct the_struct;
我需要一个概念来检查是否每个 v
都小于sizeof(t)
。
解决方案
如果您想将概念用作模板参数的命名类型约束,如您的示例中所示,则该概念需要应用于类型模板参数。
但是,您仍然可以定义仅适用于例如非类型模板参数的概念,只要您在允许这些的上下文中使用它;例如使用要求子句:
template<int v1, int v2>
concept the_concept2 = v1 > v2;
template<int v1, int v2> requires the_concept2<v1, v2>
struct some_struct2{};
using valid = some_struct2<42, 41>;
//using invalid = some_struct2<42, 42>; // constraints not satisfied
另一个应用于函数模板或类模板的成员函数的示例:
template<int v1, int v2>
concept the_concept2 = v1 > v2;
template <int a, int b>
void bar() requires the_concept2<a, b> {}
template <int a, int b>
struct Foo {
static void bar() requires the_concept2<a, b> {}
};
int main() {
bar<2, 1>();
Foo<2, 1>::bar();
//bar<2, 2>(); // candidate template ignored: constraints not satisfied
//Foo<2, 2>::bar(); // invalid reference to function 'bar': constraints not satisfied
}
以下 OP 编辑(基本上提出了一个完全不同的问题)
编辑:我的最终目标是在模板结构的声明中使用这个概念,其中包含可变参数模板参数,例如:
template<typename t, std::size_t ... v> struct the_struct;
我需要一个概念来检查是否每个
v
都小于sizeof(t)
。
可以通过指定概念本身来应用可变参数非类型模板参数来实现,这些参数在sizeof(T) > v
检查中使用参数包扩展进行扩展:
#include <cstddef>
#include <cstdint>
template<typename T, std::size_t... v>
concept the_concept1 = (... && (sizeof(T) > v));
template<typename T, std::size_t... vs> requires the_concept1<T, vs...>
struct the_struct;
using TypeOfSize4Bytes = uint32_t;
using valid = the_struct<TypeOfSize4Bytes, 1, 3, 2, 1>;
using also_valid = the_struct<TypeOfSize4Bytes>;
//using invalid = the_struct<TypeOfSize4Bytes, 1, 2, 4>; // error: constraints not satisfied
推荐阅读
- google-cloud-platform - 项目的结算帐号未打开 GCP
- apache-spark - 为什么缓存小型 Spark RDD 需要在 Yarn 中分配大量内存?
- aws-lambda - 如何从另一个 AWS 账户中的步进函数调用一个 AWS 账户中的步进函数?
- javascript - 如何在 p5 Canvas 上居中图像/CreateCapture
- python - Pandas & seaborn:如何根据预定义的标准对调查答案进行分类
- javascript - 如何以角度实现从url栏直接搜索?
- python - 迭代地将 numpy 或 torch 数组绘制为图像并打开按键
- mysql - 列计数与第 1 行的值计数不匹配 - MySQL
- javascript - 使用useState Hook时如何重构具有先前状态的if else if?
- python - 我需要在某个日期创建的所有子文件夹中找到所有文本文件,打开它们,然后将内容复制到一个文本文件中