2011-11-10 89 views
1

我使用Boost.Parameter庫爲構造函數提供命名參數。如何在傳遞參數時使用boost :: ref和Boost.Parameter庫?

BOOST_PARAMETER_NAME(windowFunction) 

namespace detail 
{ 

struct ClassAImpl 
{ 
    template <class ArgumentPack> 
    ClassAImpl(ArgumentPack const& args) 
     : mWindowFun(args[_windowFunction]) 
      , [...] 
    { 

    } 

    boost::function<bool(int, int)> mWindowFun; 
    [...] 
}; 
} 

struct ClassA : detail::ClassAImpl 
{ 
    BOOST_PARAMETER_CONSTRUCTOR(
      ClassA, (detail::ClassAImpl), tag 
      , (optional (windowFunction,*) 
      [...])) 
}; 

通常windowFunction將由boost::function對象被複制,但是,我想也可以參照與boost::ref通過。

但是,當我傳遞一個函數對象boost::ref時,reference_wrapper<T>被刪除,並且參數包含一個對T值的引用。

問題:有沒有辦法阻止reference_wrapper<T>包裝的移除?

實施例:

SomeFunctionObject s; 
ClassA a(windowFunction = boost::ref(s)); 

將具有SomeFunctionObject& s傳遞給mWindowFunClassAImpl代替const reference_wrapper<SomeFunctionObject>&構造。因此,s將被boost::function複製,這是不希望的。

回答

1

這似乎目前不可能,因爲升壓參數明確展開reference_wrapper s。

這是允許通過引用傳遞位置參數所必需的。