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

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

Изменено 08.12.2024 19:13 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); };


А теперь подумай и скажи, действительно ли это проблема С++? Может, дело, все-таки, в твоем бедном уровне владения С++, которое не позволяет тебе распознать откровенный говнокод? При этом ты назойливо поднимаешь и поднимаешь эту тему, предлагая что-то улучшать.
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); };


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