【发布时间】: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