【问题标题】:Is it possible to create a vector of concept ? std::vector<Concept auto>是否可以创建概念向量? std::vector<概念自动>
【发布时间】:2020-05-04 00:17:15
【问题描述】:

我正在尝试研究概念功能和语法,但我没有想出 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;
}

【问题讨论】:

  • 您是在问是否可以创建满足概念的异构类型的向量?
  • 向量持有一种类型。您必须选择一种可以容纳任何这些值的单一类型。
  • 是的,我的目标是拥有一个具有概念的异构类型的向量,或者一个单一类型的向量,我在这两种情况下都失败了。
  • 第一个是不可能的。第二个应该是(即类型必须满足概念的向量),但编辑您的问题以显示您为此尝试过的内容。
  • 如果你有时间投资,this video 会深入探讨实现这种类型擦除的技术。该链接指向一个时间戳,其内容与幻灯片上您的问题中的代码非常相似,但演讲的大部分内容都在讨论他的实际解决方案,最后一部分侧重于未来可能的语言更改,以启用更易于使用的库.

标签: c++ c++20 c++-concepts


【解决方案1】:

您不能拥有异构类型的 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实际上不满足Compare 的概念。如果你改变operator&lt;=&gt;的返回类型,像这样:

std::partial_ordering operator<=>(const Cat&) const = default;

您可以创建Cats 的向量:

vec<Cat> a{
   Cat{4, "Faisca"},
   Cat{4, "Neka"}
};

【讨论】:

  • 感谢您的告知,但它没有显示std::vector&lt;Concept auto&gt; 的用法。
  • 从概念上讲,如果我理解你的意图的话。只是语法不正确。 std::vector&lt;Concept auto&gt;的意图什么?
【解决方案2】:

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

vector&lt;T&gt; 是一个序列容器,序列容器包含给定类型的对象。 单个给定类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    相关资源
    最近更新 更多