std :: function返回任何可求和的类型?

时间:2013-08-08 14:16:06

标签: c++ templates c++11 openmp std-function

我的并行算法的图形数据结构具有以下迭代器方法:

/**
 * Iterate in parallel over all nodes of the graph and call handler (lambda closure).
 */
void Graph::parallelForNodes(std::function<void(node)> handle) {
    #pragma omp parallel for
    for (node v = 0; v < z; ++v) {
        // call here
        handle(v);
    }
}

我本可以将handle函数声明为模板参数,但我认为C ++ 11中的首选方法是使用std::function

现在我想使用OpenMP和这样的迭代器执行并行缩减。每次调用handle的返回值都减少为一个总和。使用功能模板,如下所示:

template<typename L>
inline double Graph::parallelSumForNodes(L handle) {
    double sum = 0.0;
#pragma omp parallel for reduction(+:sum)
    for (node v = 0; v < z; ++v) {
        // call here
        if (exists[v]) {
            sum += handle(v);
        }
    }
    return sum;
}

使用std::function的等价物是什么?我可以定义handle的类型以返回double或int(因为函数的主体适用于两者)。

3 个答案:

答案 0 :(得分:2)

也许是一个双参数成员函数,沿着std::accumulate

template<typename Handle, typename Accumulator>
Accumulator Graph::parallelSumForNodes(Handle handle, Accumulator sum) 
{
#pragma omp parallel for reduction(+:sum)
    for (node v = 0; v < z; ++v) {
        // call here
        if (exists[v]) {
            sum += handle(v);
        }
    }
    return sum;
}

请注意,这与std::accumulate具有相同的警告:您必须小心传递它的累加器的类型。

答案 1 :(得分:1)

以下内容允许您传递一个返回int或double(或其他数字类型)的handle到您的函数。该函数将返回句柄返回的任何类型。但是你应该注意溢出。

template<typename L>
inline L Graph::parallelSumForNodes(std::function<L(node)> handle) {
    L sum = 0;
#pragma omp parallel for reduction(+:sum)
    for (node v = 0; v < z; ++v) {
        // call here
        if (exists[v]) {
            sum += handle(v);
        }
    }
    return sum;
}

答案 2 :(得分:0)

指定模板参数以定义std :: function的返回类型:

template<typename L>
inline L Graph::parallelSumForNodes(std::function<L(node)> handle)
{
    L sum();
    ...
    return( sum );
{