2012-04-22 62 views
1

我試圖這樣做:maitain兩個向量的字符串,其中一個向量存儲值,第二個存儲相同值的引用。我認爲使用boost::reference_wrapper會做的伎倆,但它似乎不會。我的平臺是VISUAL C++ 2008您可以使用boost :: reference_wrapper將引用存儲在STL容器中嗎?

std::vector<std::string> str_vec; 
str_vec.push_back("abc"); 
str_vec.push_back("cde"); 
str_vec.push_back("fgh"); 

std::vector<boost::reference_wrapper<std::string> > str_view; 
for(std::vector<std::string>::iterator it = str_vec.begin(); it != str_vec.end(); ++it) 
{ 
    str_view.push_back(*it); 
} 

這是錯誤:

error C2664: 'std::vector<_Ty>::push_back' : cannot convert parameter 1 from std::basic_string<_Elem,_Traits,_Ax>' to 'const boost::reference

我可以使用boost::shared_ptr但我想到了一個更好的參考表達我的意圖。此代碼可能可以在C++ 11中使用std::reference_wrapper工作,但目前尚不可用。

+1

什麼是visual C++ 2009?據我所知,有2008年,2010年和2011年的測試版。 – EdChum 2012-04-22 20:56:13

回答

2

是的,它可以。該文檔指出它是CopyConstructibleAssignable這是容器模板參數的必需概念。但是您需要使用boost::refboost::cref來創建reference_wrapper類型的對象。沒有隱式轉換,這就是爲什麼你的代碼不起作用。

請注意,std::reference_wrapperboost::reference_wrapper之間的細微差別在於只有std版本適用於仿函數。

例子:

std::vector<std::string> str_vec; 
str_vec.push_back("abc"); 
str_vec.push_back("cde"); 
str_vec.push_back("fgh"); 

std::vector<boost::reference_wrapper<std::string> > str_view; 
std::transform(begin(str_vec), end(str_vec), 
       std::back_inserter(str_view), boost::ref<std::string>); 

如果你不喜歡這一點,希望有從原來的值隱式轉換,您可能需要使用:

template<typename T> 
class my_ref_wrap : public boost::reference_wrapper<T> { 
public: 
    my_ref_wrap(T& t) : boost::reference_wrapper<T>(t) {} 
}; 

std::vector<my_ref_wrap<std::string> > str_view; 
std::copy(begin(str_vec), begin(str_vec), 
      std::back_inserter(str_view)); 

雖然我不會那樣做的。

+0

你介意把你的例子放在C++ 03中嗎?我沒有一個C++ 11編譯器 – user841550 2012-04-22 21:10:43

+0

@ user841550這基本上是C++ 03。你只需要將'begin(str_vec)'改成'str_vec.begin()'。對於'end()'也是如此。 – pmr 2012-04-22 21:12:12

+0

我得到了它的感謝。 – user841550 2012-04-22 21:19:29

相關問題