私は関数をバインドし、別の関数に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);
dim
が2
に等しいテンプレートの整数であり、そして、 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.
は私が持っていると推定私のキャストのタイプミスが、私はタイプを宣言する正しい方法を知らない。これを行う適切な方法は何ですか?
公正なポイントが更新されました。 –
返事をありがとう、しかし、ここの解決策は何ですか?私の返品タイプは何ですか? std :: functionはテンプレート型で、選択したテンプレートを使用してもコンパイルできません: "エラーC2893:関数テンプレート 'unknown type std :: invoke(_Callable &&、_ Types && ...)を特殊化できませんでした) '" – user650261
私が書いたように、解決方法は' std :: bind'の戻り値を 'auto'の代わりに適切な' std :: function'に明示的に割り当てることです。 –