我有几个函数接收以下类型:
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,...)
如何获得视觉上干净的绑定和强制转换?
答案 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, ...);