以下函数的最通用语法是什么:
template<IteratorType> void myFunction(const IteratorType& myIterator)
{
_ptr = &myIterator[0];
}
它需要一个迭代器myIterator(它可以是一个原始指针),目标是将myIterator
指向的对象的地址分配给原始指针_ptr
。目前我使用&myIterator[0]
但我意识到只有随机访问迭代器才有运算符[]。
那么有一种语法适用于所有类型的标准迭代器和指针吗?
答案 0 :(得分:28)
您可以取消引用指针,然后获取对象的地址。
template<IteratorType> void myFunction(const IteratorType& myIterator)
{
_ptr = &(*myIterator);
}
答案 1 :(得分:19)
根据标准*运算符返回一个引用,所以在我看来最好的方法是&*myIterator
,但由于该类可能会超载&amp;运算符最好的方法是std::addressof(*myIterator)
,适用于所有类
答案 2 :(得分:4)
所有迭代器都需要operator *
(24.2.2:2),所以你可以写
_ptr = &*myIterator;
但是,这对输出迭代器无效,其中*r
仅在赋值操作的左侧有效(24.2.4:2)。
另请注意,*r
提供&
可以合理应用的值并不一定正确;例如,专精std::vector<bool>
(23.3.7)的reference
类型不是bool &
。在你的情况下,赋值_ptr = &*myIterator
会捕获这个,假设_ptr
是一个合适的指针类型,你会遇到编译失败。
答案 3 :(得分:1)
我希望你们现在都还活着。如果您的迭代器是 std::vector
的迭代器,则有一种更好的方法来获取迭代器所持有的地址。您可以使用:
auto *ptr = myIterator._Ptr;
希望我能正确回答你的问题。