繁体   English   中英

是否可以创建概念向量? 标准::向量<concept auto></concept>

[英]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"}
};

您不能在这样的模板参数列表中使用占位符类型( autodecltype(auto) ,有或没有约束)。 您必须使用具体类型或依赖 class 模板参数从 C++17 推导(根本不指定模板 arguments)。

vector<T>是一个序列容器,序列容器包含给定类型的对象。 单个给定类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM