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

Сообщение Re[2]: Накидайте плиз задачек на знание языка Си++ от 04.04.2025 8:43

Изменено 04.04.2025 9:38 rg45

Re[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;
}


Так норм?
Re[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;
}