Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
// 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);
}
нет, это не катит, потому что как ты мог заметить для этого нужны новые классы. а просто без классов - вот так как к ГК сверху. но даже последний вариант весьма несовершенен, т.к. с темплейтами не совместим: поинтер (на метод или на член) не может быть параметром темплейта. другими словами в С++ это: либо туевы хучи одноразовых классов либо куча писанины в каждом месте где это нужно. и С++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, ...); при том, не то, что разных функций, а ещё и функций для разных экземпляров и типов классов одновременно.
в процессе написания очередного онального извращения все руки тарасика обильно вымазываются в жидком борландопоносе.
впоследствии же он лезет в интернеты и кидается этим говном во все стороны считая это троллингом.
я кончил.
Этот код не показывает нужность указателей на члены. Вот если нам нужно положить элемент в несколько независимых интрузивных списков (например связать разрежённую матрицу по строкам и столбцам) — это будет полезно.
что-то я тут не очень понял. Адрес может быть параметром или что имелось в виду?
>что-то я тут не очень понял. Адрес может быть параметром или что имелось в виду?
имелось в виду что я тормозил - по крайней мере с указателями на члены.
с глобальными поинтерами и указетелями на методы это точно не работает. если покажете как можно с указателями на методы (без доп интерфейса, например `apple *apple::get_next()`) буду оч благодарен.
Вот пример с указателем на функцию:
>o_;
>o_(&o)
это не смайлики - это уточки!
Он высиживает яйца
И куда подевался Тарас??
И вообще где здесь С++???
он считает, дескать, так оно и не надо - чтоб в ногу лишний раз не стрелять.
но как только приспичивает; то тарасик наговнокодит очередной анальный изврат и радуется как малое дитя - смотрите как посрал, ололо!
впоследствии же он лезет в интернеты и кидается этим говном во все стороны считая это троллингом.
я кончил.