The C++20 standard brought C++ programmers a new tool for meta template programming, concepts.
Concepts allow programmers to specify requirements for the type, to make instantiation of template possible. The compiler looks for a template with the concept that has the highest requirements. Here is an example of the famous
Fizz buzz problem solved with Template Meta Programming. import std; import boost.type_index; // for pretty printing of types using std::tuple; using boost::typeindex::type_id; /** * Type representation of words to print */ struct Fizz {}; struct Buzz {}; struct FizzBuzz {}; template struct Number { constexpr static size_t N = M; }; /** * Concepts used to define condition for specializations */ template concept HasN = requires { requires A::N - A::N == 0; }; template concept FizzConc = HasN && requires { requires A::N % 3 == 0; }; template concept BuzzConc = HasN && requires { requires A::N % 5 == 0; }; template concept FizzBuzzC = FizzConc && BuzzConc; /** * By specializing `res` structure, with concepts requirements, proper instantiation is performed */ template struct Res; template struct Res { using Result = FizzBuzz; }; template struct Res { using Result = Fizz; }; template struct Res { using Result = Buzz; }; template struct Res { using Result = X; }; /** * Predeclaration of concatenator */ template struct Concatenator; /** * Recursive way of concatenating next types */ template struct Concatenator> { using Type = typename Concatenator>::Result, Args...>>::Type; }; /** * Base case */ template struct Concatenator> { using Type = tuple; }; /** * Final result getter */ template using FizzBuzzFull = typename Concatenator>::Result>>::Type; int main(int argc, char* argv[]) { // printing result using boost.type_index, so it's clear std::println("{}", type_id>().pretty_name()); } /* Result: std::tuple, Number, Fizz, Number, Buzz, Fizz, Number, Number, Fizz, Buzz, Number, Fizz, Number, Number, FizzBuzz, Number, Number, Fizz, Number, Buzz, Fizz, Number, Number, Fizz, Buzz, Number, Fizz, Number, Number, FizzBuzz, Number, Number, Fizz, Number, Buzz, Fizz, Number, Number, Fizz, Buzz, Number, Fizz, Number, Number, FizzBuzz, Number, Number, Fizz, Number, Buzz, Fizz, Number, Number, Fizz, Buzz, Number, Fizz, Number, Number, FizzBuzz, Number, Number, Fizz, Number, Buzz, Fizz, Number, Number, Fizz, Buzz, Number, Fizz, Number, Number, FizzBuzz, Number, Number, Fizz, Number, Buzz, Fizz, Number, Number, Fizz, Buzz, Number, Fizz, Number, Number, FizzBuzz, Number, Number, Fizz, Number, Buzz, Fizz, Number, Number, Fizz, Buzz> • / ==Benefits and drawbacks of template metaprogramming==