12

目前我能想到的最好方法是使用 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()
{
}
4

1 回答 1

5

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

该关键字requires以两种方式使用: 1) 引入一个 requires 子句,它指定对模板参数或函数声明的约束。

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

开始一个 requires-expression,它是一个 bool 类型的纯右值表达式,描述了一些模板参数的约束。如果满足相应的概念,则该表达式为真,否则为假:

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

于 2018-01-10T14:47:26.180 回答