c++ 如何判断函数是否为非空函数?

7qhs6swi  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(157)

我有这个代码:

template<class T>
concept Indexable = requires(T t, size_t val){
    !std::is_same<decltype(t.operator[](val)), void>::value;
};

它在这个测试中不起作用,我不明白如何检查函数是否为非空。

struct bad {
    void operator[](size_t) {
       // need to return 
    }
};
static_assert(!Indexable<bad>, "fail");

但在其他类似的情况下,它可以工作:

static_assert(Indexable<std::map<int, std::string>>, "fail");

我尝试过void、void()和其他模板,但最终都成功了。

cyvaqqii

cyvaqqii1#

要求表达式已经有了“检查某个表达式的结果是否满足一个概念”的语法。所以你应该使用它。

template<typename T>
concept is_void_type = std::is_void_v<T>;

template<typename T>
concept is_not_void_type = !is_void_type<T>;

template<typename T>
concept indexable = requires(T t, std::size_t sz)
{
  {t[sz]} -> is_not_void_type;
};

Here's a working example .

相关问题