Сообщение Re[2]: template (синтаксис) больше не нужен? от 01.11.2023 23:37
Изменено 01.11.2023 23:52 johny5
Re[2]: template (синтаксис) больше не нужен?
Здравствуйте, reversecode, Вы писали:
Вот накидал пример с перегрузкой (оставим за скобками целесообразность кода, только синтаксис).
Было:
Стало:
template<typename .. исчезли. Правда они появились у concept, но это новый, мимикрирующий синтаксис.
Playground
Вот накидал пример с перегрузкой (оставим за скобками целесообразность кода, только синтаксис).
Было:
template<typename CONTAINER, typename OBJ_T>
typename CONTAINER::const_iterator find(const CONTAINER& cont, const OBJ_T& obj)
{
return std::find(cont.begin(), cont.end(), obj);
}
template<typename K, typename V, typename A, typename C, typename T>
typename std::map<K,V,A,C>::const_iterator find(const std::map<K,V,A,C>& cont, const T& key)
{
return cont.find(key);
}
Стало:
template<typename T, typename V>
concept HasFind = requires (T a, V b) { a.find(b); };
auto find(const auto& container, const auto& key) requires HasFind<decltype(container), decltype(key)>
{
return container.find(key);
}
auto find(const auto& container, const auto& key) requires (!HasFind<decltype(container), decltype(key)>)
{
return std::find(container.begin(), container.end(), key);
}
template<typename .. исчезли. Правда они появились у concept, но это новый, мимикрирующий синтаксис.
Playground
Re[2]: template (синтаксис) больше не нужен?
Здравствуйте, reversecode, Вы писали:
Вот накидал пример с перегрузкой (оставим за скобками целесообразность кода, только синтаксис).
Было:
Стало:
template<typename .. исчезли. Правда они появились у concept, но это новый, мимикрирующий синтаксис.
Playground
Вот накидал пример с перегрузкой (оставим за скобками целесообразность кода, только синтаксис).
Было:
template<typename CONTAINER, typename OBJ_T>
typename CONTAINER::const_iterator find(const CONTAINER& cont, const OBJ_T& obj)
{
return std::find(cont.begin(), cont.end(), obj);
}
template<typename K, typename V, typename A, typename C, typename T>
typename std::map<K,V,A,C>::const_iterator find(const std::map<K,V,A,C>& cont, const T& key)
{
return cont.find(key);
}
Стало:
template<typename T, typename V>
concept HasFind = requires (T a, V b) { a.find(b); };
auto find(const auto& container, const auto& key) requires HasFind<decltype(container), decltype(key)>
{
return container.find(key);
}
auto find(const auto& container, const auto& key) requires (!HasFind<decltype(container), decltype(key)>)
{
return std::find(container.begin(), container.end(), key);
}
template<typename .. исчезли. Правда они появились у concept, но это новый, мимикрирующий синтаксис.
Playground