如何声明一个需要范围的函数

Gri*_*kin 9 c++ range-v3

我想声明一个函数,它获取一个范围作为输入,输出一个数字并将其直接与 range-v3 库的 range::views::transform 一起使用。

以下内容有效,但我必须使用一个实际上不做任何事情的 lambda。

int64_t getGroupValue( ranges::input_range auto&& group ) {
    return ranges::accumulate( group, 1ll, ranges::multiplies() );
}

int64_t calculateGroupSum( const std::vector<int>& data ) {
    using ranges::views::transform;
    using ranges::views::chunk;

    return ranges::accumulate(
        data
        | chunk( 3 )
        | transform( [] ( auto group ) { return getGroupValue( group ); })
        , 0ll);
}
Run Code Online (Sandbox Code Playgroud)

我想做以下事情:

int64_t calculateGroupSum( const std::vector<int>& data ) {
    using ranges::views::transform;
    using ranges::views::chunk;

    return ranges::accumulate(
        data
        | chunk( 3 )
        | transform( getGroupValue )
        , 0ll);
}
Run Code Online (Sandbox Code Playgroud)

通过为 getGroupValue() 使用不同的参数类型是否可以实现这一点,或者我是否必须使用 lambda?

app*_*ple 4

函数模板无法传递。*

一种方法是将其包装在 lambda 对象中,就像您已经做的那样,或者您可以首先将其编写为函数对象。

struct getGroupValue_op{
    int64_t operator()( ranges::input_range auto&& group ) const{
        return ranges::accumulate( group, 1ll, ranges::multiplies() );
    }
} getGroupValue;
Run Code Online (Sandbox Code Playgroud)

*如果参数具有特定类型,它可以工作,但情况并非如此range::views::transform