将std :: plus<>()作为谓词传递

时间:2014-06-06 14:38:29

标签: c++ c++11 stl

我需要将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())
        );
    }
}

1 个答案:

答案 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...);