【问题标题】:Do C++ Concepts allow for my class at declaration/definition to specify it satisfies certain concept?C++ 概念是否允许我的类在声明/定义时指定它满足某些概念?
【发布时间】:2018-01-10 14:26:13
【问题描述】:

目前我能想到的最好方法是使用 static_assert,但我更喜欢更好的方法。

#include <set>
#include <forward_list>

using namespace std;

template<typename C>
concept bool SizedContainer = requires (C c){
    c.begin();
    c.end();
    {c.size()} -> size_t;
};

static_assert(SizedContainer<std::set<int>>);
static_assert(!SizedContainer<std::forward_list<int>>);
static_assert(!SizedContainer<float>);

class MyContainer{
public:
    void begin(){};
    void end(){};
    size_t size(){return 42;}; 
};

static_assert(SizedContainer<MyContainer>);



int main()
{
}

【问题讨论】:

  • 首先我被炒作并想使用 CRTP,但后来我想起 MyContainer 不完整,因此概念检查可能会失败。所以我没有看到更好的方法。
  • @StoryTeller 我在 MyContainer 类之前尝试了 FWD 声明和静态断言,但它只是默默地失败了......可能是相同的潜在问题。
  • 为什么static_assert 不是测试这个的合适方法?对我来说,需要检查什么似乎很清楚。并且一个类的整个概念接口不受其定义的约束,因此没有理由期望此类检查成为定义的一部分。

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


【解决方案1】:

目前没有,您要查找的关键字是 requires 来自cppreference

关键字requires有两种使用方式:1)引入一个 requires-clause,指定模板参数的约束或 在函数声明上。

由于您不是在处理函数声明,因此这无关紧要。 第二种情况是

开始一个 requires-expression,它是一个 prvalue 类型的表达式 描述某些模板参数的约束的布尔值。这样的 如果满足相应的概念,则表达式为真,并且 否则为假:

这在此处不再相关,因为您没有尝试验证对某些模板参数的约束

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 2020-01-27
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 2016-03-20
    相关资源
    最近更新 更多