2016-02-23 74 views
1

我是新來的C++,特別是模板。我試圖使用bind來重載模板函數 - 實際函數是serial_port :: set_option。現在我已經達到以下形式:std爲重載模板函數綁定

auto f = std::bind(static_cast<boost::system::error_code(serial_port::*) 
(const SettableSerialPortOption&,boost::system::error_code&)> 
(&serial_port::set_option),sp_ptr,_1,ec); 

與sp_ptr定義爲:

std::shared_ptr<serial_port> sp_ptr; 

重載方法定義是:

template< 
    typename SettableSerialPortOption> 
boost::system::error_code set_option(
    const SettableSerialPortOption & option, 
    boost::system::error_code & ec); 

我的目的是得到這樣的電話:

f(boost::asio::serial_port::baud_rate(9600)); 

工作。我不知道在哪裏定義名稱SettableSerialPortOption。你能提供一些幫助嗎?更新: 我能夠做到這一點的:

auto &local_ptr = sp_ptr; 
auto f = [local_ptr,&ec] (auto a){local_ptr->set_option(a,ec);}; 
f(baud_rate); 

感謝彼得·Skotnicki的解決方案。

+0

不會'std :: bin(static_cast <...>(...),sp_ptr.get(),...)'工作嗎? – YSC

+0

甚至'std :: bin(static_cast <...>(...),* sp_ptr.get(),...)' – YSC

+2

我想'SettableSerialPortOption'不是一個具體的類型嗎?因爲你需要一個通用的lambda(C++ 14),或者一個自定義函子 –

回答

2

更新:我能做到這一點的:

auto &local_ptr = sp_ptr; 
auto f = [local_ptr,&ec] (auto&& a){local_ptr>set_option(decltype(a)a,ec);}; 
f(baud_rate); 

感謝彼得·Skotnicki的解決方案。(完美的轉發)感謝Yakk,我需要閱讀有關這方面的內容,這對我來說是相當技術性的,但對於其他用戶和未來的參考,顯然這是要走的路。