将迭代器转换为指针:真的(& * it)?

时间:2014-04-26 20:49:31

标签: c++ pointers iterator

注意 已修改以解决关闭原因

我需要获取一个指向我有迭代器的对象的指针。只要有一个迭代器但是需要调用一个函数(可能是第三方)来获取指针,这是必需的。

丑陋的(&*it)(甚至it.operator->())真的是标准成语吗?为什么没有ptr(iterator)喜欢

template<typename It>
inline auto ptr(It const&it) -> decltype(std::addressof(*it))
{
  return std::addressof(*it);
}
支持这个的论据:

  1. 它具有描述性,因此更清晰(尽管这确实是基于意见的)。
  2. 更安全:考虑operator&过载的类型
  3. 避免与运营商偏好混淆:考虑 &*it->member();(你是否100%确定这是做什么的?它不是你想要的......)

2 个答案:

答案 0 :(得分:2)

如果您不喜欢这种奇怪的语法,可以使用此功能:

std::address_of(*it);

答案 1 :(得分:0)

我不确定,但我认为一些迭代器(例如在向量或数组中)可以简单地实现为指针。那么任何方法都是不可能的,这种语法&*it将是通用的。

顺便说一句,如果你想要ptr(iterator),你可以定义类似这样的东西

template<typename T1, typename T2>
inline T1* ptr(T2 it) {
    return &*it;
}

或更多“hacky”方式

#define ptr(x) (&*x)
相关问题