Tiny C++ template metaprogramming helpers
The snippet can be accessed without any authentication.
Authored by
Vladislav Antonov
template_metaprogramming_helpers.cpp 1.68 KiB
// https://vawale.github.io/posts/template_metaprogramming_helpers/
template<typename... Args>
consteval auto count() {
return sizeof...(Args);
}
template<template <typename T> typename Predicate, typename... Args>
consteval auto count_if() -> size_t {
return (0 + ... + Predicate<Args>{}());
}
template<typename T>
struct is_signed_type {
consteval bool operator ()() const {
return std::is_signed_v<T>;
}
};
template<template <typename T> typename Predicate, typename... Args>
consteval auto all_of() -> bool {
return (Predicate<Args>{}() && ...);
}
template<template <typename T> typename Predicate, typename... Args>
consteval auto any_of() -> bool {
return (Predicate<Args>{}() || ...);
}
template<template <typename T> typename Predicate, typename... Args>
consteval auto none_of() -> bool {
return !any_of<Predicate, Args...>();
}
template<template <typename T> typename Func, typename... Args>
consteval void for_each() {
(Func<Args>{}(), ...);
}
template<typename T>
struct assert_arithmetic {
consteval void operator ()() const {
static_assert(std::is_arithmetic_v<T>, "T must be arithmetic type");
}
};
template<template <typename T> typename Func, typename... Args>
consteval void for_each_tuple_type(std::tuple<Args...>) {
(Func<Args>{}(), ...);
}
template<template <typename T> typename Func, template Tuple>
consteval void for_each_tuple_type() {
auto evaluator = []<typename Tuple, template <typename T> typename Func, size_t... I>(std::index_sequence<I...>) {
(Func<std::tuple_element_t<I, Tuple>>{}(), ...);
};
evaluator.template operator() <Tuple, Func>
(std::make_index_sequence<std::tuple_size_v<Tuple>>());
}
Please register or sign in to comment