TGViewer
C++ geek C++ geek @cpp_geek · 3.53K subscribers
Post #460 739
Полезные функции, которые будут полезны продвинутым C++ разработчикам.

1. void assert_or_throw(bool cond, const std::string& msg)

Универсальная замена assert в runtime-среде:


void assert_or_throw(bool cond, const std::string& msg) {
if (!cond) throw std::runtime_error(msg);
}



2. template<typename T> std::string to_string_precise(const T& val, int precision = 6)

Преобразование чисел с точностью:


template<typename T>
std::string to_string_precise(const T& val, int precision = 6) {
std::ostringstream out;
out << std::fixed << std::setprecision(precision) << val;
return out.str();
}



3. template<typename F> auto scope_exit(F&& f)

RAII-функция для отложенного вызова:


template<typename F>
class ScopeExit {
F func;
bool active = true;
public:
ScopeExit(F&& f) : func(std::forward<F>(f)) {}
~ScopeExit() { if (active) func(); }
void dismiss() { active = false; }
};

template<typename F>
ScopeExit<F> scope_exit(F&& f) {
return ScopeExit<F>(std::forward<F>(f));
}



4. template<typename T> constexpr bool is_power_of_two(T x)

Компилируемая проверка степени двойки:


template<typename T>
constexpr bool is_power_of_two(T x) {
return x > 0 && (x & (x - 1)) == 0;
}



5. template<typename T> void hash_combine(std::size_t& seed, const T& val)

Для реализации собственного std::hash:


template<typename T>
void hash_combine(std::size_t& seed, const T& val) {
seed ^= std::hash<T>()(val) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}



6. std::vector<std::string> split(const std::string& str, char delimiter)

Полезна для парсинга CSV, логов и т.д.:


std::vector<std::string> split(const std::string& str, char delimiter) {
std::vector<std::string> out;
std::istringstream ss(str);
std::string token;
while (std::getline(ss, token, delimiter)) {
out.push_back(token);
}
return out;
}



7. template<typename T> T clamp(T val, T min_val, T max_val)

Ручной аналог std::clamp (если нужна совместимость со старым C++):


template<typename T>
T clamp(T val, T min_val, T max_val) {
return std::max(min_val, std::min(val, max_val));
}



8. template<typename Container, typename Predicate> bool any_of(const Container& c, Predicate pred)

Упрощённая обёртка над std::any_of:


template<typename Container, typename Predicate>
bool any_of(const Container& c, Predicate pred) {
return std::any_of(c.begin(), c.end(), pred);
}



9. template<typename... Args> std::string format(const std::string& fmt, Args&&... args)

Интерфейс к std::format (C++20+):


template<typename... Args>
std::string format(const std::string& fmt, Args&&... args) {
return std::vformat(fmt, std::make_format_args(args...));
}



10. template<typename T> std::string type_name()

Получение имени типа на этапе компиляции:


template<typename T>
std::string type_name() {
#ifdef __clang__
std::string name = __PRETTY_FUNCTION__;
return name.substr(31, name.length() - 32);
#elif defined(__GNUC__)
std::string name = __PRETTY_FUNCTION__;
return name.substr(49, name.length() - 50);
#elif defined(_MSC_VER)
std::string name = __FUNCSIG__;
return name.substr(38, name.length() - 45);
#else
return "unknown";
#endif
}


📲 Мы в MAX

➡️ @cpp_geek
  • 👍 2
  • 🔥 2
More from @cpp_geek
  1. Sep 24, 2026🎥 Вебинар по C++: Паттерн многопоточного программирования «Producer-Consumer» Когда неско…
  2. Sep 24, 2026Execution policy для параллельных алгоритмов Execution policy в C++ — это новшество, введе…
  3. Sep 17, 2026В чем разница между git fetch и git pull? Разница между этими командами заключается в том,…
  4. Sep 15, 2026std::tie std::tie — это функция, которая создает кортеж ссылок на lvalue из своих аргумент…
  5. Sep 11, 2026move constructor Move-конструктор — это специальный конструктор, который позволяет эффекти…
  6. Sep 9, 2026Move-only объекты и почему std::unique_ptr нельзя копировать Многие удивляются, когда комп…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →