Кресты / Говнокод #7131 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 Aleskey, (Updated )

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

    • А то, что С++ не совершенен. Везде уже делегаты нормальные есть.
      Ответить
        • нет, это не катит, потому что как ты мог заметить для этого нужны новые классы. а просто без классов - вот так как к ГК сверху. но даже последний вариант весьма несовершенен, т.к. с темплейтами не совместим: поинтер (на метод или на член) не может быть параметром темплейта. другими словами в С++ это: либо туевы хучи одноразовых классов либо куча писанины в каждом месте где это нужно. и С++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()`) буду оч благодарен.
              Ответить
        • В C# делегаты способны делать одновременно много вызовов за 1 вызов delegat1(param1, ...); при том, не то, что разных функций, а ещё и функций для разных экземпляров и типов классов одновременно.
          Ответить
            • Нет. Делегаты С#'па обладают практически теме же способностями, что и эвент, как бы это не было странно...
              Ответить
  • А чего комметариев так мало?
    И куда подевался Тарас??
    И вообще где здесь С++???
    Ответить
    • Да просто его дельфи такое вообще не умеет. 😀
      Ответить
      • ну да фичи, которые в плюсах давным-давно сделали более-менее юзабельными, в говноделфях отсутствуют в принципе.

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

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

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8