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

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

Изменено 08.12.2024 19:06 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

#include <iostream>
#include <vector>
#include <set>

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

int main()
{
    std::cout << HasFindMember<std::vector<int> > << ' '
              << HasFindMember<std::set<int> > << std::endl;
}


И даже эти три строчки, повторюсь, пришлось писать исключительно как дань тупизне постановки задачи.

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


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