Код (Text): #include <iostream> template<class face> face getFace(face) { static face _face; return _face; }; template<class face> face* getFace(face*) { static face _face; return &_face; }; template<char className> struct SimpleFace { void printMe() { std::cout << "ClassName is "<< className << std::endl; }; }; template<class face, char className> struct TrollFace : public SimpleFace<className> { face operator->() const { return getFace(face()); }; }; typedef SimpleFace<'H'> H; struct G: public TrollFace< H, 'G'>{}; struct F: public TrollFace< G, 'F'>{}; struct E: public TrollFace< F*, 'E'>{}; struct D: public TrollFace< E*, 'D'>{}; struct C: public TrollFace< D*, 'C'>{}; struct B: public TrollFace< C, 'B'>{}; struct A: public TrollFace< B, 'A'>{}; int main() { A a; a.printMe(); // 'A' a->printMe(); // 'D' } На сайте говнокод.ру наткнулся на такой вот кусок кода. Это был тест в одну из фирм. Объясните, почему во втором случае выводится D? почему operator->() вызывается 3 раза? По идее он должен вызываться только для A::operator->() и, соответственно, возвращать класс B и далее у этого класса должен вызываться метод printMe().
то есть в коде Код (Text): std::auto_ptr<A> a(..); a->f(); оператор -> по сути отрабатывает 2 раза: первый для класса std::auto_ptr, второй - непосредственно для указателя A*, возвращаемого этим оператором?
Код (Text): class B { public: void func() { } }; class A { public: B* operator -> () { static B b; return &b; } }; int main() { A a; a->func(); } Как-то коряво получается: как бы вызываю метод класса A, а на самом деле дёргается метод класса B.. Любой нормальный человек пойдёт искать у класса A метод func, не найдёт и сойдёт с ума.