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

converting iterator to pointer: really (&*it)?

本文关键字:真的 转换 迭代器 指针      更新时间:2023-10-16

注释 经过编辑以解决关闭的原因

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

丑陋的(&*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%确定这是什么吗?这不是你想要的…)

如果你不喜欢奇怪的语法,可以使用这个函数:

std::address_of(*it);

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

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

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

或更"黑客"的方式

#define ptr(x) (&*x)