1. C++ / Говнокод #7131

    +166

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    // say this is some existing structure. And we want to use
    // a list. We can tell it that the next pointer
    // is apple::next.
    struct apple {
        int data;
        apple * next;
    };
    
    // simple example of a minimal intrusive list. Could specify the
    // member pointer as template argument too, if we wanted:
    // template<typename E, E *E::*next_ptr>
    template<typename E>
    struct List {
        List(E *E::*next_ptr):head(0), next_ptr(next_ptr) { }
    
        void add(E &e) {
            // access its next pointer by the member pointer
            e.*next_ptr = head;
            head = &e;
        }
    
        E * head;
        E *E::*next_ptr;
    };
    
    int main() {
        List<apple> lst(&apple::next);
    
        apple a;
        lst.add(a);
    }

    c++ страшный язык :) (часть вторая)

    C++: Pointer to class data member: http://stackoverflow.com/questions/670734/c-pointer-to-class-data-member

    Такие конструкции "E *E::*next_ptr;" без подготовки не осилить.

    Запостил: Aleskey, 02 Июля 2011

    Комментарии (35) RSS

    • показать все, что скрытоmacGovno
      Ответить
    • Чего же он до 19 августа не дотянул-то, блин.
      Ответить
    • Ну pointer to member и что?
      Ответить
      • А то, что С++ не совершенен. Везде уже делегаты нормальные есть.
        Ответить
        • http://en.wikipedia.org/wiki/Delegation_pattern#Complex_C.2B.2B_examp le не?
          Ответить
          • Говнокод как всегда покалечил ссылку.
            Ответить
            • http://en.wikipedia.org/wiki/Delegation_pattern#Complex_C.2B.2B_example
              Ответить
          • нет, это не катит, потому что как ты мог заметить для этого нужны новые классы. а просто без классов - вот так как к ГК сверху. но даже последний вариант весьма несовершенен, т.к. с темплейтами не совместим: поинтер (на метод или на член) не может быть параметром темплейта. другими словами в С++ это: либо туевы хучи одноразовых классов либо куча писанины в каждом месте где это нужно. и С++11 даже не пытается этой ситуации никак помочь.
            Ответить
            • >>поинтер (на метод или на член) не может быть параметром темплейта
              что-то я тут не очень понял. Адрес может быть параметром или что имелось в виду?
              #include <iostream>
              using namespace std;
              
              // say this is some existing structure. And we want to use
              // a list. We can tell it that the next pointer
              // is apple::next.
              struct apple {
                  int data;
                  apple * next;
              };
              
              // simple example of a minimal intrusive list. Could specify the
              // member pointer as template argument too, if we wanted:
              // template<typename E, E *E::*next_ptr>
              template<typename E, E *E::*next_ptr>
              struct List {
                  List():head(0) {
                  }
              
                  void add(E &e) {
                      // access its next pointer by the member pointer
                      e.*next_ptr = head;
                      head = &e;
                  }
              
                  E * head;
              };
              
              int main() {
                  List<apple, &apple::next> lst;
              
                  apple a;
                  lst.add(a);
              }
              Ответить
              • >>>поинтер (на метод или на член) не может быть параметром темплейта
                >что-то я тут не очень понял. Адрес может быть параметром или что имелось в виду?

                имелось в виду что я тормозил - по крайней мере с указателями на члены.

                с глобальными поинтерами и указетелями на методы это точно не работает. если покажете как можно с указателями на методы (без доп интерфейса, например `apple *apple::get_next()`) буду оч благодарен.
                Ответить
                • Мы не поняли, что вы хотите. Покажите не компилирующийся, по вашему мнению, код и мы его исправим.
                  Ответить
                • Полно signal/slot библиотек, если я правильно понял что нужно.
                  Вот пример с указателем на функцию:
                  #include <iostream>
                  
                  class Hello {
                   public:
                    void world(std::string text) {
                      std::cout << "Hello " << text << "!" << std::endl;
                    }
                  };
                  
                  template<typename T, void (T::*fn_)(std::string)>
                  struct delegat1v {
                    delegat1v(T& o) : o_(&o) {}
                    void operator ()(std::string text) {
                       (o_->*fn_)(text);
                    }
                   private:
                    T* o_;
                  };
                  
                  int main() {
                    Hello hello;
                    hello.world("world");
                  
                    delegat1v<Hello, &Hello::world> d1v(hello);
                    d1v("world! One more time");
                  }
                  Ответить
          • В C# делегаты способны делать одновременно много вызовов за 1 вызов delegat1(param1, ...); при том, не то, что разных функций, а ещё и функций для разных экземпляров и типов классов одновременно.
            Ответить
            • чо-чо? евентсинк чтоли?
              Ответить
              • Нет. Делегаты С#'па обладают практически теме же способностями, что и эвент, как бы это не было странно...
                Ответить
    • А чего комметариев так мало?
      И куда подевался Тарас??
      И вообще где здесь С++???
      Ответить
      • Да просто его дельфи такое вообще не умеет. :D
        Ответить
        • ну да фичи, которые в плюсах давным-давно сделали более-менее юзабельными, в говноделфях отсутствуют в принципе.

          он считает, дескать, так оно и не надо - чтоб в ногу лишний раз не стрелять.

          но как только приспичивает; то тарасик наговнокодит очередной анальный изврат и радуется как малое дитя - смотрите как посрал, ололо!
          Ответить
          • в процессе написания очередного онального извращения все руки тарасика обильно вымазываются в жидком борландопоносе.
            впоследствии же он лезет в интернеты и кидается этим говном во все стороны считая это троллингом.
            я кончил.
            Ответить
    • Этот код не показывает нужность указателей на члены. Вот если нам нужно положить элемент в несколько независимых интрузивных списков (например связать разрежённую матрицу по строкам и столбцам) — это будет полезно.
      Ответить

    Добавить комментарий