将迭代器转换为指针:真的(&*它)?
converting iterator to pointer: really (&*it)?
注释 经过编辑以解决关闭的原因
我需要获得一个指向对象的指针,我有一个迭代器。只要有迭代器,但需要调用带有指针的函数(可能是第三方),就需要这样做。
丑陋的(&*it)
(甚至it.operator->()
)真的是标准成语吗?为什么没有像那样的ptr(iterator)
template<typename It>
inline auto ptr(It const&it) -> decltype(std::addressof(*it))
{
return std::addressof(*it);
}
支持这一点的论据:
- 它是描述性的,因此更清晰(尽管这确实是基于观点的)
- 更安全:考虑
operator&
过载的类型 - 它避免了与操作员偏好混淆:考虑
&*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)
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- static_cast:转换函数模板——它们真的有效吗
- 为什么 lambda 会转换为值为真的布尔值?
- 将对象的第一个字段强制转换为对象的类型是否真的安全?
- 我真的应该每次在基元类型之间转换时都使用static_cast吗
- 在C++中的函数调用内部执行强制转换时,强制转换是否真的有效
- 大多数编译器将% 2转换为位比较吗?真的更快吗?
- 将迭代器转换为指针:真的(&*它)?