Skip to content
Snippets Groups Projects

Tiny C++ template metaprogramming helpers

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    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>>());
    }
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Please register or to comment