Информация об изменениях

Сообщение Re: Что не так с C++ - компил-таймовый C++ от 08.12.2024 18:23

Изменено 08.12.2024 20:00 rg45

Re: Что не так с C++ - компил-таймовый C++
Здравствуйте, Shmj, Вы писали:

S>Пример: https://www.programiz.com/online-compiler/6fkrEBCC3yqjv

S>- ну изврат же?

Конечно, изврат. По своему скудоумию данное решение может соперничать, разве что, с тупой постановкой задачи. Продетектить наличие члена с именем find, безотносительно того функция это, данное или тип.

Но даже в такой тупой постановке, даже на C++03, эта задача могла быть решена более компактно и элегантно. На С++11 — ещё более компактно и элегантно. На С++20 это решение в три строчки:

http://coliru.stacked-crooked.com/a/eaa800071fdddec0

struct Fallback { int find; };
template <typename T> struct HasFindMemberAux : T, Fallback { };
template <typename T> concept HasFindMember = not requires { &HasFindMemberAux<T>::find; };


И даже эти три строчки, повторюсь, пришлось писать исключительно как дань тупизне постановки задачи. На самом деле, как мне кажется, автора интересовало, всё-таки наличие функции-члена find (шаблонной или нешаблонной). И в этом случае решение могло бы выглядеть как нельзя более естественно и лаконично:

http://coliru.stacked-crooked.com/a/d136bbed619483db

template <typename T>
concept HasFindMethod = requires(T t, T::key_type key) { t.find(key); };


А если вспомнить, что С++ позволяет непосредственно использовать констрейнты, без определения концептов, то, возможно, вообще ничего писать не пришлось бы. Тут уже чисто предпочтения программиста — насколько он хочет, чтоб код выглядел самодокументированным.

А вот так могло бы выглядть это же решение на С++03: http://coliru.stacked-crooked.com/a/dcdb0473b3c69a03. Не настолько элегантно и лаконично, как на С++20, конечно, но по-любому лучше, чем та порнота, которую ты притащил.

А теперь подумай и скажи, действительно ли это проблема С++? Может, дело, все-таки, в твоем бедном уровне владения С++, которое не позволяет тебе распознать откровенный говнокод? Глядя на какой-нибудь код, ты не понимаешь, что данную задачу можно было решать разными способобами, что этих способов может быть множество, что у каждого из этих способов есть свои плюсы и свои минусы. Но при этом ты назойливо поднимаешь и поднимаешь одну и ту же тему, предлагая что-то улучшать
Re: Что не так с C++ - компил-таймовый C++
Здравствуйте, Shmj, Вы писали:

S>Пример: https://www.programiz.com/online-compiler/6fkrEBCC3yqjv

S>- ну изврат же?

Конечно, изврат. По своему скудоумию данное решение может соперничать, разве что, с тупой постановкой задачи. Продетектить наличие члена с именем find, безотносительно того функция это, данное или тип.

Но даже в такой тупой постановке, даже на C++03, эта задача могла быть решена более компактно и элегантно. На С++11 — ещё более компактно и элегантно. На С++20 это решение в три строчки:

http://coliru.stacked-crooked.com/a/eaa800071fdddec0

struct Fallback { int find; };
template <typename T> struct HasFindMemberAux : T, Fallback { };
template <typename T> concept HasFindMember = not requires { &HasFindMemberAux<T>::find; };


И даже эти три строчки, повторюсь, пришлось писать исключительно как дань тупизне постановки задачи. На самом деле, как мне кажется, автора интересовало, всё-таки наличие функции-члена find (шаблонной или нешаблонной). И в этом случае решение могло бы выглядеть как нельзя более естественно и лаконично:

http://coliru.stacked-crooked.com/a/d136bbed619483db

template <typename T>
concept HasFindMethod = requires(T t, T::key_type key) { t.find(key); };


А если вспомнить, что С++ позволяет непосредственно использовать констрейнты, без определения концептов, то, возможно, вообще ничего писать не пришлось бы. Тут уже чисто предпочтения программиста — насколько он хочет, чтоб код выглядел самодокументированным.

А вот так могло бы выглядть это же решение на С++03: http://coliru.stacked-crooked.com/a/dcdb0473b3c69a03. Не настолько элегантно и лаконично, как на С++20, конечно, но по-любому лучше, чем та порнота, которую ты притащил.

А теперь подумай и скажи, действительно ли это проблема С++? Может, дело, все-таки, в твоем бедном уровне владения С++, которое не позволяет тебе распознать откровенный говнокод? Глядя на какой-нибудь код, ты не понимаешь, что данную задачу можно было решать разными способобами, что этих способов может быть множество, что у каждого из этих способов есть свои плюсы и свои минусы. Но при этом ты назойливо поднимаешь и поднимаешь одну и ту же тему, предлагая что-то улучшать.