2016-12-04 16 views
1

私は関数をバインドし、別の関数にvoid *として渡してキャストしたいとしましょう。void *へのstd :: bind関数のポインタをキャストして返します

私は機能をキャストしようとしたグローバルな機能があります。

void function_wrapper(void * func){ 

std::function<void(const std::vector<double>&, const std::vector<double>&)> * function = reinterpret_cast<std::function<void(const std::vector<double>&, const std::vector<double>&)> *>(func); 

std::function<void(const std::vector<double>&, const std::vector<double>&)> function_ = *function; 
} 

FUNCが、一方、として作成されます。ここでは

auto func = std::bind(&MyObj<dim>::myfunc, this, _1, _2); 

dim2に等しいテンプレートの整数であり、そして、 function_wrapperは、

function_wrapper((void *)(&func)); 

一方、myfuncはタイプとMyObj<dim>の方法は次のとおりです。

void myfunc(const std::vector<double>& x, std::vector<double>& F) const; 

私は上記のように、私はときに私もデリファレンス次のエラーを取得するfunction_wrapper呼び出そう:

Exception thrown: read access violation. 

std::_Func_class<void,std::vector<double,std::allocator<double> > const & __ptr64,std::vector<double,std::allocator<double> > const & __ptr64>::_Getimpl(...) returned 0xFFFFFFFFFFFFFFFF. 

If there is a handler for this exception, the program may be safely continued. 

は私が持っていると推定私のキャストのタイプミスが、私はタイプを宣言する正しい方法を知らない。これを行う適切な方法は何ですか?

答えて

0

std::bindの結果は、示されたコードを前提としているため、std::functionではありません。図示コードがvoid *からstd::bindからの戻り値へのポインタをキャストするとき、これは、未定義の動作をもたらす、その後呼び出しまたは関数オブジェクトにアクセスし、std::functionに戻るポインタにそれをキャストし、このように

[func.bind.isbind]指定std::bind次のように:

テンプレート<クラスF、クラス... BoundArgs > 不定バインド(F & & F、 BoundArgs & & ... bound_args);戻り値と

:「弱い結果のタイプ(20.9.2)との転送呼ラッパーグラムグラムの効果は、(U1、U2、...、UM)(INVOKEでなければなりませんfd、std :: forward(v1)、std :: forward(v2)、...、std :: forward(vN)、result_of_t)」を参照してください。

これだけです。 std::bindによって返されるクラスは不特定であり、与えられたC++実装が何とかstd::functionを生成することは確かに許可されていますが、そうする必要はありません。

しかし、解決策は簡単です。std::bindの戻り値を適切なstd::functionに明示的に割り当てます。

+0

公正なポイントが更新されました。 –

+0

返事をありがとう、しかし、ここの解決策は何ですか?私の返品タイプは何ですか? std :: functionはテンプレート型で、選択したテンプレートを使用してもコンパイルできません: "エラーC2893:関数テンプレート 'unknown type std :: invoke(_Callable &&、_ Types && ...)を特殊化できませんでした) '" – user650261

+0

私が書いたように、解決方法は' std :: bind'の戻り値を 'auto'の代わりに適切な' std :: function'に明示的に割り当てることです。 –

関連する問題