C++ C++;20个概念和模板:固定大小和可调整大小的数组
我最近开始学习C++20中引入的新特性。我在实现概念方面有些困难 玩具示例: 我想定义一个表示可调整大小数组的概念:C++ C++;20个概念和模板:固定大小和可调整大小的数组,c++,templates,c++20,c++-concepts,C++,Templates,C++20,C++ Concepts,我最近开始学习C++20中引入的新特性。我在实现概念方面有些困难 玩具示例: 我想定义一个表示可调整大小数组的概念: template<class T> concept ResizableArray= std::is_same<std::vector<double>, T>::value; 模板 概念大小调整LearRay=std::is_same::value; 这样的代码在VisualStudio下编译,运行良好。然而,我一直在写一个表示任意大小的固定
template<class T>
concept ResizableArray= std::is_same<std::vector<double>, T>::value;
模板
概念大小调整LearRay=std::is_same::value;
这样的代码在VisualStudio下编译,运行良好。然而,我一直在写一个表示任意大小的固定大小数组的概念(std::array,std::array…应该是有效的)。我的尝试:
template<template<unsigned int> class T, unsigned int S>
concept FixedArray = std::is_same<std::array<double, S>, T<double, S>>::value;
模板
concept fixedaray=std::is_same::value;
不编译
问题:
模板
概念数组=std::is|same::value | std::is|same::value;
不编译
如果您有任何建议,我们将不胜感激。请在此处查看类型
T
:
模板<
/*T只有一个模板参数*/
模板类T,
无符号整数
>概念固定阵列=\
std::是一样的吗<
std::数组,
/*两个参数*/
T
>::价值;
你说,T
是模板参数。它只有一个类型为unsigned int
的非类型自己的模板参数,但后来您编写了T
-这里T
有两个模板参数-这是一个错误
你必须这样写:
模板<
/*两个模板参数*/
模板类T,
无符号整数
>概念固定阵列=\
std::is_same::value;
我认为具有可调整大小或不可调整大小的数组的情况也存在相同的问题。尝试修复固定大小的数组概念,并加入编写良好的可调整大小的数组概念
UPD:
而且,为什么不这样写呢
模板
概念固定阵列=\
std::is_same::value;
我认为你对概念的理解是错误的。如果要为某些类型使用强类型标志,则模板类专门化或常量表达式别名可以像过去一样使用:
模板
结构是固定的数组:std::false\u类型{};
//只能通过专门化处理数组。
模板
结构是固定数组:std::true\u类型{};
模板
constexpr bool is_fixed_array_v=is_fixed_array::value;
相反,对于概念,您希望检查对象接口,而不考虑实际的类型,并避免与std::is_same
进行强烈比较。下面是一个小例子,说明我的意思:
模板
概念尺寸调整LearRay=需要(T容器)
{
//我只接受具有resize(std::size\t)方法的类型
resize(std::size\u t{0});
//进一步告诉你的是一个数组。。。
};
模板
概念固定阵列=需要(T容器)
{
//我只接受用tuple_size指定的类型
std::tuple\u size\u v->std::convertible\u to;
//进一步告诉你的是一个数组。。。
};
//使用与数组完全相同的接口初始化
模板
struct MyArray:std::array{};
静态断言(是固定数组);
//静态断言(是固定数组);//断言失败!
//相反,概念可以与任何类型一起工作,这些类型可以填充定义的接口
静态断言(resizebalarray);
静态_断言(未调整大小);
静态断言(非固定数组);
静态断言(固定数组);
template<template<unsigned int> class T, unsigned int S>
concept Array= std::is_same<std::vector<double>, T>::value || std::is_same<std::array<double, S>, T<S>>::value;