2017-11-21 27 views
-1

私は、次のタイプ受け取るいくつかの機能があります:array2Dはカスタム型であるC++:のstd ::バインド - >のstd ::機能

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

を。

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,... 

だから、コードの塊は、醜いobfuscativeおよび反復的です。


私は、ドキュメントを読んでいる、と私は書くことができなければならないことを理解する:

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

あなたは第二のラムダでどのようなエラーのですか? Lambdaはほとんどの場合、 'std :: bind'よりも優先されます。可能であれば、ラムダ版で動作させようとします。 – 0x5453

+0

@ 0x5453ああ、ok。 1秒、私はそれを実行します – bordeo

+0

@ 0x5453エラーがアップしています。内部の型が 'array2D > *' – bordeo

答えて

3

How do I get a visually clean bind and cast?

一つの方法は次のとおりです。

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, ...); 

または:

mix_2D_model(F(step_func), ...); 
+0

素晴らしい - 私がメインの方法で行っているように、視覚的に見えます。あなたはここで何をしているのかを説明する秒がありますか?いずれにせよ、ありがとう - 受け入れ – bordeo

+0

@bordeoそれは['function cast expression'](http://en.cppreference.com/w/cpp/language/explicit_cast)表記を使用します。基本的に、ラムダを渡す 'F'コンストラクタを呼び出します。 –

+0

大丈夫、クール - 私はそれをチェックします。ありがとう。 – bordeo

関連する問題