C metaprogramming template