通过引用列表中的元素获取列表迭代器 C++编码中的P> 假设我有一个函数,它返回对特定列表中元素的引用(我无法更改返回类型或函数的作用)。 有没有办法,通过返回的引用,我可以得到该列表中特定元素的迭代器? 谢谢 Roy

通过引用列表中的元素获取列表迭代器 C++编码中的P> 假设我有一个函数,它返回对特定列表中元素的引用(我无法更改返回类型或函数的作用)。 有没有办法,通过返回的引用,我可以得到该列表中特定元素的迭代器? 谢谢 Roy,c++,list,reference,iterator,listiterator,C++,List,Reference,Iterator,Listiterator,仅当您有权访问列表时。如果您打算使用迭代器,这应该是给定的 您必须再次迭代列表,并检查迭代器返回的每个元素,直到您匹配给定的引用。好的,您可以以不安全的方式进行操作,假设std::list::iterator实现为指向列表节点的指针。基本上,您需要调整值的地址以获得封闭列表节点的地址,这将是迭代器的值 实际代码(与gcc和mac上的clang一起使用): //不同Ts的偏移量可能不同 模板 std::ptrdiff_t list_node_payload_offset(){ std::列表ls

仅当您有权访问列表时。如果您打算使用迭代器,这应该是给定的


您必须再次迭代列表,并检查迭代器返回的每个元素,直到您匹配给定的引用。

好的,您可以以不安全的方式进行操作,假设
std::list::iterator
实现为指向列表节点的指针。基本上,您需要调整值的地址以获得封闭列表节点的地址,这将是迭代器的值

实际代码(与gcc和mac上的clang一起使用):

//不同Ts的偏移量可能不同
模板
std::ptrdiff_t list_node_payload_offset(){
std::列表lst;
一、推回(T{});
auto lst_begin=lst.begin();
返回reinterpret_cast(std::addressof(lst.front()))-
*重新解释演员表(std::addressof(lst_begin));
}
#pragma GCC优化“无严格别名”
模板
typename标准::列表::迭代器到列表迭代器(T&T){
静态常量自动偏移=列表\节点\有效负载\提供();
自动节点地址=重新解释转换(std::addressof(t))-偏移量;
返回*重新解释铸件(&iter)值;
}
#pragma GCC优化“严格别名”

引用的对象不知道它是列表的一部分,请查看。如果您没有访问列表本身的权限,则不。如果您访问了,则可以
std::find
列表中的元素。
// Offset may vary for different Ts
template <typename T>
std::ptrdiff_t list_node_payload_offset() {
    std::list<T> lst;
    lst.push_back(T{});
    auto lst_begin = lst.begin();
    return reinterpret_cast<uint8_t*>(std::addressof(lst.front())) -
        *reinterpret_cast<uint8_t**>(std::addressof(lst_begin));
}

#pragma GCC optimize "no-strict-aliasing"
template <typename T>
typename std::list<T>::iterator to_list_iterator(T& t) {
    static const auto offset = list_node_payload_offest<T>();
    auto node_address = reinterpret_cast<uint8_t*>(std::addressof(t)) - offset;
    return *reinterpret_cast<typename std::list<T>::iterator*>(&iter_value);
}
#pragma GCC optimize "strict-aliasing"