我创建了一个函数,给定一个类型T的列表和一个谓词(指向指定函数的指针),计算列表中有多少元素返回true。
这适用于原子谓词(isEven,isOdd,is_less_than_42),但如果我想将它与N-ary谓词一起使用,我该怎么办?有没有办法传递N-ary谓词所需的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;
}
答案 0 :(得分:1)
您可以使用std::bind
将N-ary函数转换为一元函数对象。
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