Оператор стрелки элемента обрабатывается компилятором особым образом. Поскольку перегруженный оператор стрелки может иметь произвольный тип возврата, нескольким таким операторам из разных классов, возможно, потребуется «прикован» вместе, чтобы получить значение указателя. Этот процесс «цепочки» выполняется автоматически/за кулисами компилятором. Перегруженный метод класса T Operator-> () {...} можно вручную назвать, как и любой другой метод (например, return obj.operator-> (); ), но это просто дает Результат типа T . Я хотел бы знать, есть ли какой-то конкретный способ вручную вызывать этот перегруженный оператор-> () , который приведет к получению базового значения указателя «прикован» вместо произвольного типа результата t .
В следующем примере есть 3 различных способа получения основного значения указателя «прикованной», о котором я думал, но ни один из них не решает проблему:
Код: Выделить всё
struct A {
int data;
int* operator->() { return std::addressof(this->data); }
};
struct B {
A operator->() { return A(); }
};
struct C {
B operator->() { return B(); }
};
template
struct D {
T x;
int* operator->() {
// Trying to access the underlying int* pointer
return this->x.operator->(); // (1)
return std::addressof(*this->x); // (2)
return this->x.operator->().operator->().operator->(); // (3)
}
};
int main() {
D da;
D db;
D dc;
}
(1) вызов оператора-> () члена t x , как метод. Для специализации D это будет работать, однако как d , так и d приведут к ошибке компиляции, поскольку результат вызова оператора-> ()
Подробнее здесь:
https://stackoverflow.com/questions/794 ... ecursively