2015-10-13 66 views
1

我的boost :: function與模板函數一起出現問題。情景如下;在模板中使用boost :: function

我想在另一個稱爲「setter」的函數中運行一個函數。我的功能是一樣的東西

data.totalSize(TotalSize); 

總計TOTALSIZE函數的輸入參數的類型是「uint32_t的」和輸出參數的類型是「無效的」。

所以我決定使用boost :: function;下面是我的代碼:

setter(boost::bind(&myIDL::payload::totalSize,boost::ref(data),_1),(TotalSize)); 

和setter方法實現

template<typename Outer> 
inline void setter(boost::function<void(Outer)> myFunc, Outer myValue) 
{ 
    myFunc(myValue); 
} 

我將得到下面的編譯錯誤:

error: no matching function for call to setter(boost::_bi::bind_t<void, boost::_mfi::mf1<void,myIDL::payload, unsigned int>, boost::_bi::list2<boost::reference_wrapper<myIDL::payload>, boost::arg<1> > >, quint32&)' 

看來,升壓::功能不理解我模板類型。所以我決定寫如下:

template<typename Outer> 
inline void setter(boost::function<void(unit32_t)> myFunc, Outer myValue) 
{ 
    myFunc(myValue); 
} 

它的工作原理!所以我想知道如何解決我的問題。預先感謝您的幫助。

最好的問候, 禮

+0

不要把'提升:: function',讓編譯器推導一個函數對象的類型。 'boost :: function'不能從'boost :: bind'返回 –

+0

推斷出來親愛的@Prior,你能解釋一下嗎?其實我沒有得到你的解決方案。 – Reza

回答

2

模板參數類型推演僅演繹類型,它不考慮任何轉換。 就像編譯器沒有忘記通知你的boost::bind結果產生了一些難以啓齒類型的prvalue:

boost::_bi::bind_t<void, boost::_mfi::mf1<void,myIDL::payload 
         , unsigned int> 
         , boost::_bi::list2<boost::reference_wrapper<myIDL::payload> 
             , boost::arg<1> > > 

其中,很明顯,是不一樣

boost::function<void(Outer)> 

也就是說,不能從參數表達式的類型推導出類型模板參數Outer。一個解決辦法是接受任何函數對象:

template <typename F, typename Outer> 
inline void setter(F myFunc, Outer myValue) 
{ 
    myFunc(myValue); 
} 

或將Outer在非推斷上下文(和支付類型擦除的價格):

#include <boost/mpl/identity.hpp> 

inline void setter(boost::function<void(typename boost::mpl::identity<Outer>::type)> myFunc 
       , Outer myValue) 
{ 
    myFunc(myValue); 
} 
相關問題