在C ++编码中: 假设我有一个函数返回对某个列表中元素的引用(我无法更改返回类型或函数的作用)。 有没有办法,通过返回引用,我可以将迭代器添加到该列表中的特定元素? 谢谢, 罗伊
答案 0 :(得分:0)
仅当您有权访问该列表时。如果您打算使用迭代器,那么这应该是给定的。
您必须再次迭代列表,并检查迭代器返回的每个元素,直到您匹配给定的引用。
答案 1 :(得分:0)
嗯,你可以用 unsafe 方式做到这一点,假设std::list<T>::iterator
实现为指向列表节点的指针。基本上你需要调整你的值的地址来获得封闭列表节点的地址,这将是迭代器的值。
实际代码(适用于Mac上的gcc和clang):
// 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"