2016-12-04 98 views
1

假設我想綁定一個函數,然後將其作爲void *傳遞給另一個函數,並將其轉回。將std :: bind函數指針轉換爲void *並返回

我有一個全局函數中,我試着投功能:

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

同時,myfuncMyObj<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,如顯示的代碼所假定的。

這樣,當所示出的代碼鑄指針從std::bindvoid *返回值,然後投射回一個指向std::function,然後調用或訪問功能對象,這導致未定義的行爲。

[func.bind.isbind]指定std::bind如下:

模板< F級,類... BoundArgs > 未指定綁定(F & &樓 BoundArgs & & ... bound_args);

隨着返回值:「一個轉發調用包裝有弱的結果類型(20.9.2)G的影響(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:未能專用函數模板'未知類型std :: invoke(_Callable &&,_類型&& ...)'「 – user650261

+0

正如我寫的,解決方案是顯式地將'std :: bind'的返回值賦給相應的'std :: function',而不是'auto'。 –

相關問題