簡體   English   中英

對模板使用boost :: function

[英]Using boost::function with templates

我在使用boost :: function和模板函數時遇到了問題。 情況如下。

我想在另一個名為“ setter”的函數中運行一個函數。 我的功能就像

data.totalSize(TotalSize);

totalSize函數的輸入參數的類型為“ uint32_t”,輸出參數的類型為“ void”。

所以我決定使用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&)'

似乎boost :: function無法理解我的模板類型。 因此,我決定將其編寫如下:

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

而且有效! 所以我想知道如何解決我的問題。 在此先感謝您的幫助。

最好的問候,Reza

模板參數類型推導僅推導類型,不考慮任何轉換。 就像編譯器不會通知您一樣, 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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM