C ++:std :: bind - >的std ::功能

时间:2017-11-21 18:04:27

标签: c++11 functional-programming bind

我有几个函数接收以下类型:

function<double(int,int,array2D<vector<double *>>*)>

array2D是自定义类型。此外,我有一个函数,它接受以下作为参数:

double ising_step_distribution(double temp,int i,int j,array2D<vector<double *>>* model)

现在,为了绑定第一个值temp,并返回一个具有正确签名的仿函数,我写道:

double temp = some_value;
function<double(int,int,array2D<vector<double *>>*)> step_func = 
    [temp](int i, int j, array2D<vector<double *>>* model){
        return ising_step_distribution(temp,i,j,model);
    }
}

这很有效。但是,以下休息:

auto step_func = 
    [temp](int i, int j, array2D<vector<double *>>* model){
        return ising_step_distribution(temp,i,j,model);
    }
}

出现以下错误:

candidate template ignored: 
could not match 
'function<double (int, int, array2D<vector<type-parameter-0-0 *, allocator<type-parameter-0-0 *> > > *)>' 
against 
'(lambda at /Users/cdonlan/home/mcmc/main.cpp:200:25)'
void mix_2D_model(function<double(int,int,array2D<vector<T*>>*)> step_distribution_func,...

所以,代码丛是丑陋的,混淆的和重复的(因为我做了很多这些)。

我一直在阅读文档,我知道我应该能够写下来:

function<double(int,int,array2D<vector<double *>>*)> step_func = 
    bind(ising_step_distribution,temp,_1,_2,_3);

但是,我见过的示例适用于function<void()>类型的函数。这个失败并出现错误:

// cannot cast a bind of type 
// double(&)(double,int,int,array2D<vector<double *>>*) 
// as function<double(int,int,...)

如何获得视觉上干净的绑定和强制转换?

1 个答案:

答案 0 :(得分:3)

  

如何获得视觉上干净的绑定和强制转换?

一种方法是:

public class MyProcessTask extends Task<SomeData> {

    @Override
    protected SomeData call() throws Exception {
        MyProcess process = new MyProcess();
        process.setProgressUpdate(p -> updateProgress(p, 1.0));
        return process.call();
    }
}

然后:

using F = function<double(int,int,array2D<vector<double *>>*)>;
auto step_func = 
    [temp](int i, int j, array2D<vector<double *>>* model){
        return ising_step_distribution(temp,i,j,model);
    }
}

或者:

auto step_func_2 = F(step_func);
mix_2D_model(step_func_2, ...);