【问题标题】:Cast pointer to reference_wrapper to pointer to underlying?将指向reference_wrapper的指针转换为指向底层的指针?
【发布时间】:2014-07-29 13:22:37
【问题描述】:

这是我的情况:

我得到的数据是指针,比如double*

我想将其包装在 vector 中以使用库,并避免弄乱指针。

不想复制整个数组,我使用引用包装向量。如果我想在使用库后从上述vector 中获取double*,我可以通过转换vector.data() 函数来获得它吗?

例如:

double* arr = new double[10];
vector<reference_wrapper<const double> > vec(arr,arr+10);

//use library in some manner.

//is this allowed? is there a more appropriate way?
//or should I forget using reference_wrappers in this way.
double* res = (double*) vec.data()

【问题讨论】:

  • std::reference_wrapper&lt;const T&gt;*不是T*。再多的演员也不会改变这一点。
  • 这个参考包装向量看起来对你没什么用。你最好不要害怕“乱用指针”。如果您不必管理指向对象的生命周期,那么指针是迭代器,不多也不少。

标签: c++ pointers vector reference-wrapper


【解决方案1】:

不,这是不可能的。

doublereference_wrapper&lt;const double&gt; 是完全不相关的类型,没有办法进行这种转换。

如果你真的需要操作 C 风格的数组,你应该坚持使用std::vector&lt;double&gt;,并在需要时使用data() 成员函数访问底层数组。

【讨论】:

  • 我认为库需要std::vector&lt;double&gt; 作为输入,而不是std::vector&lt;double*&gt;
  • 好的。没有 const 的答案是一样的吧?我想我必须复制数组。
  • @retrocookie 是的
  • 严格来说,不能说reference_wrapper 与double 无关。它定义了运算符 const double&();因此,将 one 转换为 double* 有一个有效的确定性路径: double* res3 = &const_cast(static_cast(vec[0]));
【解决方案2】:

不,你不能那样做。

你可以这样做(但它很丑):

double* arr = new double[10];
std::vector<std::reference_wrapper<double>> vec(arr, arr + 10);

//use library in some manner.

//is this allowed? is there a more appropriate way?
//or should I forget using reference_wrappers in this way.
double* res = &vec[0].operator double &();
assert(res == arr);

我会忘记像这样使用reference_wrapper,而是查看提升范围:

http://www.boost.org/doc/libs/1_55_0/libs/range/doc/html/range/reference/utilities/iterator_range.html

【讨论】:

  • 哦,它可以工作。我在visual studio 2013上试过。只是不推荐。
猜你喜欢
  • 2017-05-15
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2014-07-22
  • 1970-01-01
  • 2015-08-12
  • 2021-07-22
相关资源
最近更新 更多