Сообщение Re[2]: Накидайте плиз задачек на знание языка Си++ от 04.04.2025 8:43
Изменено 04.04.2025 9:49 rg45
Re[2]: Накидайте плиз задачек на знание языка Си++
Здравствуйте, sergii.p, Вы писали:
SP>Ещё бывает по шаблонам спрашиваю. Прошу написать функцию sum, которая суммирует различные типы
SP>
http://coliru.stacked-crooked.com/a/c4b88d70e5067c24
Так норм?
Это, скажем так, параноидальный уровень обобщенности. Этот вариант учитывает, что operator+ может быть перегружен бользователем и иметь побочные эффекты и самую безумную семантику. Например, модифицировать операнды.
Если считать, что операция сложения — это всегда rvalue без каких-либо побочных эффектов и гарантирует неизменность операндов, тогда всё упрощается, конечно:
http://coliru.stacked-crooked.com/a/245d934bcd9b9088
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;
}
Re[2]: Накидайте плиз задачек на знание языка Си++
Здравствуйте, sergii.p, Вы писали:
SP>Ещё бывает по шаблонам спрашиваю. Прошу написать функцию sum, которая суммирует различные типы
SP>
http://coliru.stacked-crooked.com/a/c4b88d70e5067c24
Так норм?
Это, скажем так, параноидальный уровень обобщенности. Этот вариант учитывает, что operator+ может быть перегружен пользователем и иметь побочные эффекты и самую безумную семантику. Например, модифицировать операнды.
Если считать, что операция сложения — это всегда rvalue без каких-либо побочных эффектов и гарантирует неизменность операндов, тогда всё упрощается, конечно:
http://coliru.stacked-crooked.com/a/245d934bcd9b9088
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;
}