Re[2]: Накидайте плиз задачек на знание языка Си++
От: rg45 СССР  
Дата: 04.04.25 08:43
Оценка: 3 (2) :)
Здравствуйте, sergii.p, Вы писали:

SP>Ещё бывает по шаблонам спрашиваю. Прошу написать функцию sum, которая суммирует различные типы


SP>
SP>sum(std::string{""}, "abc");
SP>sum(0, 1.0);
SP>


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

#include <iostream>

template <typename T, typename...X>
decltype(auto) sum(T&& t, X&&...x)
requires requires {(std::forward<T>(t) + ... + std::forward<X>(x));}
{
    return (std::forward<T>(t) + ... + std::forward<X>(x));
}

int main() {
    std::cout << sum("Hello", std::string(", World"), '!') << std::endl;
}


Так норм?

Это, скажем так, параноидальный уровень обобщенности. Этот вариант учитывает, что operator+ может быть перегружен пользователем и иметь побочные эффекты и самую безумную семантику. Например, модифицировать операнды.

Если считать, что операция сложения — это всегда rvalue без каких-либо побочных эффектов и гарантирует неизменность операндов, тогда всё упрощается, конечно:

http://coliru.stacked-crooked.com/a/245d934bcd9b9088

#include <iostream>

auto sum(const auto& t, const auto&...x)
requires requires {(t + ... + x);}
{
    return (t + ... + x);
}

int main() {
    std::cout << sum("Hello", std::string(", World"), '!') << std::endl;
}
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 04.04.2025 9:49 rg45 . Предыдущая версия . Еще …
Отредактировано 04.04.2025 9:45 rg45 . Предыдущая версия .
Отредактировано 04.04.2025 9:38 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.