通过引用列表

时间:2017-03-24 13:59:15

标签: c++ list reference iterator listiterator

在C ++编码中: 假设我有一个函数返回对某个列表中元素的引用(我无法更改返回类型或函数的作用)。 有没有办法,通过返回引用,我可以将迭代器添加到该列表中的特定元素? 谢谢, 罗伊

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

嗯,你可以用 unsafe 方式做到这一点,假设std::list<T>::iterator实现为指向列表节点的指针。基本上你需要调整你的值的地址来获得封闭列表节点的地址,这将是迭代器的值。

enter image description here

实际代码(适用于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"

On Coliru