N 元谓词求值函数 (count_if)

发布于 2025-01-04 10:53:01 字数 523 浏览 1 评论 0原文

我创建了一个函数,给定一个类型 T 的列表和一个谓词(指向指定函数的指针),该函数计算列表中返回 true 的元素数量。

这适用于原子谓词 (isEven,isOdd,is_less_than_42),但是如果我想将它与 N 元谓词一起使用,我该怎么办?有没有办法传递 N 元谓词所需的 N-1 个参数的可选列表?

template<typename T, class Pred>
int evaluate(listofelements<T> &sm, Pred pred){
    typename listofelements<T>:: iterator begin, end;
    int count=0;
    begin=sm.begin();
    end=sm.end();
    while(begin!=end){
        if(pred(*(begin->data))) count++;
        begin++;
    }
    return count;
}

I created a function which, given a list of some type T, and a predicate (a pointer to a specified function), counts how many elements in the list return true.

This works with atomic predicates (isEven,isOdd,is_less_than_42), but what should I do if I want to use it with N-ary predicates? Is there any way to pass an optional list of N-1 arguments needed by the N-ary predicate?

template<typename T, class Pred>
int evaluate(listofelements<T> &sm, Pred pred){
    typename listofelements<T>:: iterator begin, end;
    int count=0;
    begin=sm.begin();
    end=sm.end();
    while(begin!=end){
        if(pred(*(begin->data))) count++;
        begin++;
    }
    return count;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

栀子花开つ 2025-01-11 10:53:01

您可以使用 std::bind 将 N 元函数转换为一元函数对象。

using std::placeholders::_1;

evaluate(sm, std::bind(some_function, _1, other, arguments));

std::bind 采用 C++11,但在较旧的编译器中,可能包含 TR1,您可以在其中使用 std::tr1::bind,最后还有Boost.Bind。

或者你可以自己构建函数对象:

struct SomeFunctor
{
    SecondType arg2;
    ThirdType arg3;
    SomeFunctor(cosnt SecondType& arg2, const ThirdType& arg3)
      : arg2(arg2), arg3(arg3)
    {}

    ResultType operator()(const FirstType& arg1) const
    {
        return some_function(arg1, arg2, arg3);
    }
};

evaluate(sm, SomeFunctor(other, arguments));
//           ^ construct SomeFunctor with arg2=other, arg3=arguments

You could use std::bind to convert an N-ary function to a unary function object.

using std::placeholders::_1;

evaluate(sm, std::bind(some_function, _1, other, arguments));

std::bind is in C++11, but in older compilers it is likely that TR1 is included where you could use std::tr1::bind, and lastly there is still Boost.Bind.

Or you could make up the function object yourself:

struct SomeFunctor
{
    SecondType arg2;
    ThirdType arg3;
    SomeFunctor(cosnt SecondType& arg2, const ThirdType& arg3)
      : arg2(arg2), arg3(arg3)
    {}

    ResultType operator()(const FirstType& arg1) const
    {
        return some_function(arg1, arg2, arg3);
    }
};

evaluate(sm, SomeFunctor(other, arguments));
//           ^ construct SomeFunctor with arg2=other, arg3=arguments
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文