20

以下函数的最通用语法是什么:

template<IteratorType> void myFunction(const IteratorType& myIterator)
{
    _ptr = &myIterator[0];
}

它采用迭代器 myIterator (它可以是原始指针),目标是将指向的对象的地址分配给myIterator原始指针_ptr。目前我使用&myIterator[0]但我意识到只有随机访问迭代器才有运算符 []。

那么是否有适用于所有类型的标准迭代器和指针的语法?

4

4 回答 4

36

您可以取消引用指针,然后获取对象的地址。

template<IteratorType> void myFunction(const IteratorType& myIterator)
{
    _ptr = &(*myIterator);
}
于 2012-08-29T13:48:08.940 回答
25

根据标准 * 运算符返回一个引用,所以在我看来最好的方法是&*myIterator,但由于类可能重载 & 运算符,最好的方法是std::addressof(*myIterator)适用于所有类

于 2012-08-29T13:49:08.063 回答
7

所有的迭代器都必须有operator *(24.2.2:2),所以你可以写

_ptr = &*myIterator;

但是,这对输出迭代器无效,其中*r仅在赋值操作 (24.2.4:2) 的左侧有效。

另请注意,不一定*r会提供&可以合理应用的值;例如,专业化std::vector<bool>(23.3.7) 的reference类型不是bool &。在您的情况下_ptr = &*myIterator,假设这_ptr是一个适当的指针类型,分配会捕获这个,并且您会遇到编译失败。

于 2012-08-29T13:49:08.003 回答
2

我希望你们现在都还活着。如果您的迭代器是 的迭代器std::vector,则有更好的方法来获取迭代器所持有的地址。您可以使用:

auto *ptr = myIterator._Ptr;

我希望我能给你的问题一个正确的答案。

于 2021-06-24T10:23:45.000 回答