2

私はこれをやろうとしています:文字列の2つのベクトルを維持し、1つのベクトルが値を格納し、2番目のベクトルが同じ値の参照を格納します。を使用boost::reference_wrapperするとうまくいくと思いましたが、そうではないようです。私のプラットフォームは Visual C++ 2008 です。

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);
}

これはエラーです:

エラー C2664: 'std::vector<_Ty>::push_back': パラメータ 1 を std::basic_string<_Elem,_Traits,_Ax> から 'const boost::reference に変換できません

使用できboost::shared_ptrましたが、参照の方が私の意図をよりよく表していると思いました。このコードはおそらく C++11 を使用して動作する可能性std::reference_wrapperがありますが、現在は利用できません。

4

1 に答える 1

3

はい、できます。ドキュメントには、それがCopyConstructibleコンテナAssignableテンプレート引数に必要な概念であると記載されています。ただし、タイプのオブジェクトを使用boost::refまたは作成する必要があります。暗黙の変換はありません。これが、コードが機能しない理由です。boost::crefreference_wrapper

std::reference_wrapperとのわずかな違いはboost::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));

私はそれをしませんが。

于 2012-04-22T20:55:31.710 に答える