你可以使用boost ::的reference_wrapper存储在STL容器引用?(Can you

2019-10-16 15:17发布

我试图做到这一点:maitain串的两个向量,其中一个向量存储值和相同价值的第二个门店引用。 我想用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 ::矢量<_Ty> ::的push_back':不能从标准:: basic_string的<_Elem,_Traits,_AX> '到' const的升压转换参数1 ::参考

我可以使用boost::shared_ptr ,但我想一个更好的参考表达我的意图。 此代码大概可以工作在C ++ 11使用std::reference_wrapper但现在不是提供给我。

Answer 1:

是的,它可以。 该文件指出,它是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));

虽然我不会那样做的。



文章来源: Can you use boost::reference_wrapper to store references in an STL container?
标签: c++ boost