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

Сообщение Re[2]: template (синтаксис) больше не нужен? от 01.11.2023 23:37

Изменено 01.11.2023 23:52 johny5

Re[2]: template (синтаксис) больше не нужен?
Здравствуйте, reversecode, Вы писали:

Вот накидал пример с перегрузкой (оставим за скобками целесообразность кода, только синтаксис).

Было:
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 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