Можно ли создать вектор концепции? станд :: вектор - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь изучить функциональность и синтаксис концепции, но мне не удалось найти работающий пример 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;
}

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

Вы не можете иметь std::vector гетерогенных типов.

Однако у вас может быть std::vector типа T, который удовлетворяет концепции. Просто укажите шаблон псевдонима, который ограничен:

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<=>, например:

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

, вы можете создать вектор Cat s:

vec<Cat> a{
   Cat{4, "Faisca"},
   Cat{4, "Neka"}
};
1 голос
/ 04 мая 2020

Вы не можете использовать типы заполнителей (auto и decltype(auto), с или без ограничений) в таких списках аргументов шаблона. Вы должны либо использовать конкретный тип, либо полагаться на вывод аргументов шаблона класса из C ++ 17 (вообще не задавая аргументы шаблона).

A vector<T> является контейнером последовательности, а контейнеры последовательности содержат объекты данный тип. A одиночный данный тип.

...