c++ - 如何定义任意 std::vector 满足的概念?

标签 c++ templates vector c++20 c++-concepts

我想要一个 concept需要任意 vector 作为返回类型:

template<typename T>
concept HasVector = requires (T t) {
    { T.vec() } -> std::same_as<std::vector<int>>; //works
    { T.vec() } -> std::same_as<std::vector<foo>>; //want to put something arbitrary in here
}
这样我们就会有如下内容:
class A {
std::vector<int> vec() { /* ... */}
}

class B {
std::vector<double> vec() { /* ... */}
}

static_assert(HasVector<A>);
static_assert(HasVector<B>);
此外,需要一个 vector 作为返回类型会更好,其值类型满足其他一些概念,即

template<typename T>
concept Arithmetic = // as in the standard

template<typename T>
concept HasArithmeticVector = requires (T t ) {
    { T. vec() } -> std::same_as<std::vector<Arithmetic>>;
有没有办法把它放在概念的名称中?

最佳答案

我们首先编写一个变量模板来检查一个类型是否专用于一个模板:

template <typename T, template <typename...> class Z>
inline constexpr bool is_specialization_of = false;

template <template <typename...> class Z, class... Args>
inline constexpr bool is_specialization_of<Z<Args...>, Z> = true;
我们可以将其转化为一个概念:
template <typename T, template <typename...> class Z>
concept Specializes = is_specialization_of<T, Z>;
然后我们可以使用它来实现另一个概念:
template<typename T>
concept HasVector = requires (T t) {
    { t.vec() } -> Specializes<std::vector>;
};
如果你想再做进一步的检查,那只是增加了更多的要求。
template<typename T>
concept HasVector = requires (T t) {
    { t.vec() } -> Specializes<std::vector>;

    // or something along these lines
    requires Arithmetic<decay_t<decltype(t.vec()[0])>>;
    requires Arithmetic<range_value_t<decltype(t.vec())>>;
    // etc.
};

关于c++ - 如何定义任意 std::vector 满足的概念?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68522152/

相关文章:

带指针的 C++ 模板 - 无法转换模板参数

C++ - 混洗对象 vector

c++ - 使用 boost::bind 排序

c++ - 当数组大小已满时如何将循环数组的内容复制到更大的数组中

c++ - 为什么在 C++20 中删除了许多标准库类型的运算符!=?

c++ - 将类型添加到现有模板中,但不删除c++ 17

c++ - weak_ptr 是基类的,而 shared_ptr 是派生类的?

c++ - C++98 中基于范围的 for 循环和 vector

c++ - 使用 getline 代替 cin >>

非 const 字符串的 C++ lambda 到 std::function 错误