2012-04-02 5 views
1

私は、boost :: unwrap_referenceをC++ 11に多く使うコードを移植するつもりです。コードはstd :: reference_wrapperをunwrapする方法:: boost :: unwrap_reference

template< typename T, typename Y> 
void initialize(T _t, Y y) 
{ 

    typename boost::unwrap_reference<T>::type & t = _t; 

    t.doSomethingNastyWithY(y); 
} 

// The function is called like this 
struct DoSomething 
{ 
    template<typename Y> 
    void doSomethingNastyWithY(Y y) 
    { 
     // do stuff 
    } 
}; 

struct Object {}; 

DoSomething s; 
Object obj; 

int main() 
{ 
    initialize(s, obj); // Take a copy of DoSomething 
    initialize(boost::ref(s), obj); // Uses DoSomething as reference 
} 

のように、私が後押しする:: unwrap_referenceをSTLに相当するものを見つけることができませんでした、多くのメンバ関数を呼び出して、これを行うために他のまっすぐな方法はありますか?

編集:私はの線に沿って

+0

'_t_stepper'は? –

答えて

5

何か例を少し明確化:しかし未テスト

template< typename T > 
struct UnwrapReference; 

template< typename T > 
struct UnwrapReference { typedef T type; } 

template< > 
struct UnwrapReference< std::reference_wrapper<T> > { typedef T type; } 

が、それはあなたがおそらくそれを行うことができるだろうかの要点です。

+0

Thx、次のコードを追加して、std :: refの代わりにboost :: refと併用すると動作します。 名前空間の拡張{ テンプレート class reference_wrapper; テンプレートクラスunwrap_reference; } テンプレート構造体UnwrapReference <ブースト:: reference_wrapper > { ::型タイプunwrap_reference型名ブースト::のtypedef 。 }; – CK1

関連する問題