如何定义返回布尔值的函数的概念

时间:2020-06-11 13:03:34

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

我想定义一个函数的概念,该函数采用单个参数并返回bool。这是我想出的:

template <typename T>
concept ConditionFunc = requires(T t) {
    { ConditionFunc(t) } -> std::same_as<bool>;
};

我想这样使用它

#include <concepts>
#include <vector>

bool IsEven(int n)
{
    return n % 2 == 0;
}

template <typename T>
void Foo(std::vector<T>& v, ConditionFunc auto func)
{
    // stuff
}

int main()
{
    std::vector<int> vec = {1, 2, 3, 4, 5};
    Foo(v, IsEven);
}

但是我遇到了错误,因为没有满足概念要求。 GCC报告说,用于定义概念T的模板类型ConditionFunc被推导为bool (*)(int),但我希望它是int

如何正确定义这个概念?

1 个答案:

答案 0 :(得分:3)

您的概念应基于两种类型,参数类型T和函数类型:

template <typename Func, typename T>
concept ConditionFunc = requires(T t, Func f) {
    { f(t) } -> std::same_as<bool>;
};

然后,您可以约束Foo接受带有签名bool(T);的函数,如下所示:

template <typename T>
void Foo(std::vector<T>& v, ConditionFunc<T> auto &func) 
{
    // stuff
}

这里是demo