有没有办法使用基于范围的迭代器来迭代对指针列表值的引用?

Tha*_*wen 2 c++ pointers iterator reference auto

所以,如果我有以下向量,其中包含几个指向int的指针:

std::vector<MyClass*> list;
Run Code Online (Sandbox Code Playgroud)

我可以稍后使用以下内容迭代它:

for (auto & (*item) : list)
{
    item.member = something;   //Goal is to require no dereferencing here
}
Run Code Online (Sandbox Code Playgroud)

使用对列表内容的值的引用比使用它们的指针稍微方便一点.

YSC*_*YSC 5

你不能.但你为什么要这样?

for (auto pitem : list)
{
    auto& item = *pitem;
    item.member = something;   // no dereferencing here
}
Run Code Online (Sandbox Code Playgroud)

除非你愿意写繁琐的代码,比如:

template<class TPointer>
class Adaptor
{
    struct Iterator
    {
        TPointer* _p;
        Iterator(TPointer* p) : _p(p) {}

        typename std::remove_pointer<TPointer>::type& operator*() { return **_p; }
        Iterator& operator++() { ++_p; return *this; }
        friend Iterator operator+(const Iterator& lhs, size_t s) { return lhs._p + s; }
        friend bool operator!=(const Iterator& lhs, const Iterator& rhs) { return lhs._p != rhs._p; }
    };

    std::vector<TPointer>& _v;
public:
    Adaptor(std::vector<TPointer>& v) : _v(v) {}
    Iterator begin() { return &_v[0]; }
    Iterator end()   { return begin() + _v.size(); }
};
Run Code Online (Sandbox Code Playgroud)

你才能写下:

struct SomeData { int n; } s1{2}, s2{4};
std::vector<SomeData*> data{&s1, &s2};

for (auto& item : Adaptor{data}) {
    std::cout << item.n << "\n";
}
Run Code Online (Sandbox Code Playgroud)

现场演示