我需要将std::plus<>()
作为谓词传递给一个类似于累积的函数,但我不太清楚如何实现这一点。我想将std::plus
传递给的模板参数是:
Pred && op
当我尝试将std :: plus用作op
时:
return detail::reduce(..., std::plus<>()); //.... op = std::plus<>()
但是这不起作用,我得到了我应该看到的错误error C2976: 'std::plus' : too few template arguments
,但我不知道如何解决这个问题并正确传递加号。
我正在使用op的一个上下文:
std::accumulate(first, last, std::forward<T>(init),
std::forward<Pred>(op)));
detail::reduce
的一次重载:
template <typename ExPolicy, typename InIter, typename T, typename Pred>
typename detail::algorithm_result<ExPolicy, T>::type
reduce_seq(ExPolicy const&, InIter first, InIter last, T && init,
Pred && op)
{
try {
return detail::algorithm_result<ExPolicy, T>::get(
std::accumulate(first, last, std::forward<T>(init),
std::forward<Pred>(op)));
}
catch(std::bad_alloc const& e) {
boost::throw_exception(e);
}
catch (...) {
boost::throw_exception(
hpx::exception_list(boost::current_exception())
);
}
}
答案 0 :(得分:3)
如果要将谓词指定为函数参数,则必须在此上下文中为std::plus
提供类型:
some_function(std::plus<T>());
但是你可以直接将它作为模板参数:如:
template < template < class > class PRED, class T >
T foo(T a,T b)
{
return PRED<T>()(a,b);
}
int main()
{
int a = 1;
int b = 1;
foo<std::plus>(a,b);
return 0;
}
对于你的情况,我认为这会奏效:
template <template <typename> typename Pred, typename ExPolicy, typename InIter, typename T >
typename detail::algorithm_result<ExPolicy, T>::type reduce_seq(ExPolicy const&, InIter first, InIter last, T && init)
{
stuff = Pred<T>()(some_value,other_value);
}
//usage:
reduce_seq<std::plus>(arguments...);