Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 168 169 [170] 171 172 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2536
,
|
|
|
|
Цитата korvin @ а разве перекрытие виртуального метода стало чем-то необычным, что компилятор должен возмущаться? Он перекрыл виртуальный метод обычным (в Delphi они называются статическими). Если именно перекрытие, то нужно указать override. |
|
Сообщ.
#2537
,
|
|
|
|
Цитата Romkin @ Да, а что, в С++ разве нельзя объявить что-то вроде ![]() ![]() type TA = (X, Y); TB = (A,B,C,D); TMethodArray = array [TA]of array [TB] of TMethod; //двумерный, обращение типа MA[X][C] или MA[X,C] вот я и спрашивал в своем первом сегодняшнем сообщении, как объявить массив, т.е. что передать в качестве размерностей -- имена перечислений или (последний_элемент + 1)? или вообще по-другому нужно? |
|
Сообщ.
#2538
,
|
|
|
|
Цитата korvin @ как я понимаю сам массив и процедуру инициализации объявить статичными, но где лучше всего прописать вызов этой процедуры? Если статичными, то методы же не смогут быть виртуальными. Это не требуется? |
|
Сообщ.
#2539
,
|
|
|
|
Цитата Romkin @ Если статичными, то методы же не смогут быть виртуальными. э-м... хз. но в общем-то и не требуется. |
|
Сообщ.
#2540
,
|
|
|
|
Цитата korvin @ что передать в качестве размерностей -- имена перечислений или (последний_элемент + 1)? или вообще по-другому нужно? Можно последний элемент + 1(или сделать последним элементом перечисления ИМЯ_COUNT). Но вообще решение не универсальное и не красивое. Поддерживаю Игоря. |
|
Сообщ.
#2541
,
|
|
|
|
Цитата D_KEY @ Но вообще решение не универсальное мне и не нужно универсальное, мне нужно простое и читабельное. Цитата D_KEY @ и не красивое. ну не образец красоты, да, но для моих требований вполне достаточное, не вижу какую большую красоту тут предоставили бы map с pair, которые предлагал Игорь |
|
Сообщ.
#2542
,
|
|
|
|
Прям не знаю, что будет с korvin'ом, но всё же покажу этот ужас
![]() ![]() ![]() #include <iostream> #include <map> //gee.hpp enum Foo {X, Y}; enum Bar {A, B, C, D}; class Gee { private: Foo f; Bar b; void mXA (); void mXB (); void mXC (); void mXD (); void mYA (); void mYB (); void mYC (); void mYD (); struct Initializer { Initializer(); }; static Initializer init; typedef void (Gee::*handler)(); typedef std::pair<Foo, Bar> key; static std::map<key, handler>* dispatcher; public: void dispatch (); }; //// //gee.cpp Gee::Initializer::Initializer() { dispatcher = new std::map<key, handler>(); (*dispatcher)[std::make_pair(X, A)] = &Gee::mXA; } Gee::Initializer Gee::init; std::map<Gee::key, Gee::handler>* Gee::dispatcher; void Gee::dispatch() { (this->*(*dispatcher)[std::make_pair(X, A)])(); } void Gee::mXA() { std::cout << "XA" << std::endl; } //// int main() { Gee gee; gee.dispatch(); } ![]() ![]() XA Если так не нравится map - замените на массив. Вся инициализация в Gee::Initializer::Initializer. |
|
Сообщ.
#2543
,
|
|
|
|
Цитата MyNameIsIgor @ Если так не нравится map - замените на массив. да, именно так я пожалуй и поступлю =) |
|
Сообщ.
#2544
,
|
|
|
|
Цитата korvin @ да, именно так я пожалуй и поступлю =) Поверьте, читабельность лишь ухудшится |
|
Сообщ.
#2545
,
|
|
|
|
Цитата korvin @ лезть ради такой простой вещи в букварь как-то тупо, тем более когда есть более простые решения. тупо? букварь надо знать просто? это тот пример, что тебе привели простой? писать руками то, что может сделать компилятор, наверное я что-то в этой жизни не понимаю... |
|
Сообщ.
#2546
,
|
|
|
|
korvin, если простое и читабельное, то нечто подобное Дельфийному варианту Shaggy-а и у меня в голове варилось. Только не на динамических методах, а на простых массивах указателей на функции. Но это если задача на раз. Если на много разов, нужно думать в первую очередь о перспективе долгосрочной эксплуатации паттерна в разных проектах, и тут читабельность реализации уходит далеко на задний план в угоду читабельности использования. Тут я за MyNameIsIgor-я.
Есть ещё мысли касательно variadic templates и статического полиморфизма, надо ж потихонечну новые фичи пощупывать, но пока не буду пробовать, не на чем ещё компилить. |
|
Сообщ.
#2547
,
|
|
|
|
Цитата MyNameIsIgor @ Поверьте, читабельность лишь ухудшится ![]() по твоему примеру я вижу, что нет Добавлено Цитата Shaggy @ тупо? букварь надо знать мне ни разу на практике не приходилось сталкиваться с message, может он не нужен? =) |
|
Сообщ.
#2548
,
|
|
|
|
Цитата korvin @ по твоему примеру я вижу, что нет Так покажите, что получилось - мне аж интересно |
|
Сообщ.
#2549
,
|
|
|
|
![]() ![]() enum Foo { A,B,C} enum Bar { X,Y } class Gee { public Foo f; public Bar b; void AX(){"AX".Dump();} void BY(){"BY".Dump();} //... остальные public void Dispatch() { var methodName = f.ToString()+b.ToString(); GetType().InvokeMember(methodName, BindingFlags.InvokeMethod | BindingFlags.NonPublic |BindingFlags.Instance,Type.DefaultBinder,this,new object[]{}); } } void Main() { var g = new Gee(){f=Foo.B,b=Bar.X}; g.Dispatch(); } |
|
Сообщ.
#2550
,
|
|
|
|
Цитата IL_Agent @ ![]() ![]() enum Foo { A,B,C} enum Bar { X,Y } class Gee { public Foo f; public Bar b; void AX(){"AX".Dump();} void BY(){"BY".Dump();} //... остальные public void Dispatch() { var methodName = f.ToString()+b.ToString(); GetType().InvokeMember(methodName, BindingFlags.InvokeMethod | BindingFlags.NonPublic |BindingFlags.Instance,Type.DefaultBinder,this,new object[]{}); } } void Main() { var g = new Gee(){f=Foo.B,b=Bar.X}; g.Dispatch(); } хреновая магия, имхо =) Добавлено Цитата MyNameIsIgor @ Так покажите, что получилось - мне аж интересно ![]() ![]() ![]() #include <iostream> //gee.hpp enum Foo {X, Y}; enum Bar {A, B, C, D}; class Gee { public: typedef void (Gee::*proc)(); void dispatch (); private: Foo f; Bar b; void mXA (); void mXB (); void mXC (); void mXD (); void mYA (); void mYB (); void mYC (); void mYD (); struct Initializer { Initializer(); }; static proc mt[Y+1][D+1]; static Initializer init; }; //// //gee.cpp Gee::Initializer::Initializer () { mt[X][A] = &Gee::mXA; } Gee::Initializer Gee::init; Gee::proc Gee::mt[Y+1][D+1]; void Gee::dispatch () { (this->*mt[X][A])(); } void Gee::mXA () { std::cout << "XA" << std::endl; } //// int main () { Gee gee; gee.dispatch(); } единственный минус -- отсутствие возможности параметризовать типы-массивы перечислением, как в паскале множествами =( |