[英]Is it possible to create a vector of concept ? std::vector<Concept auto>
我正在尝试研究概念功能和语法,但我没有想出 std::vector 的工作示例,知道出了什么问题吗? https://gcc.godbolt.org/z/FHaQ-3
#include <vector>
#include <string>
template<typename T>
concept Compare = requires(T a, T b) {
{ a <=> b } -> std::same_as<std::partial_ordering>;
};
struct Cat {
int age;
std::string name;
auto operator<=>(const Cat&) const = default;
};
int main(int argc, char** argv) {
/* Single type: Fail
std::vector<Compare auto> vec{
Cat{4, "Faisca"},
Cat{4, "Neka"}
};
*/
/* Heterogenous: Fail
std::vector<Compare auto> vec{
Cat{4, "Faisca"}, 1, std::string{"Deu Ruim"}
};
*/
return 0;
}
您不能拥有异构类型的std::vector
。
但是,您可以拥有一个满足概念的T
类型的std::vector
。 只需提供一个受约束的别名模板:
template<typename T>
requires Compare<T>
using vec = std::vector<T>;
或使用简洁的语法:
template<Compare T>
using vec = std::vector<T>;
现在,您可以执行以下操作:
vec<Cat> v;
但不是
vec<int> v;
请注意,当前编写的Cat
class实际上并不满足Compare
概念。 如果您更改operator<=>
的返回类型,如下所示:
std::partial_ordering operator<=>(const Cat&) const = default;
您可以创建Cat
的向量:
vec<Cat> a{
Cat{4, "Faisca"},
Cat{4, "Neka"}
};
您不能在这样的模板参数列表中使用占位符类型( auto
和decltype(auto)
,有或没有约束)。 您必须使用具体类型或依赖 class 模板参数从 C++17 推导(根本不指定模板 arguments)。
vector<T>
是一个序列容器,序列容器包含给定类型的对象。 单个给定类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.