Meta programming: Declare a new struct on the fly

constexpr auto make_new_type() { return [](){}; }

using A = decltype(make_new_type<__LINE__>());
using B = decltype(make_new_type<__LINE__>());
using C = decltype(make_new_type<__LINE__>());

This works since every lambda expression results in a unique type. So for each unique value in <> you get a different function which returns a different closure. If you introduce a macro you can get rid of having to type __LINE__ like

constexpr auto new_type() { return [](){}; }

#define make_new_type new_type<__LINE__>()

using A = decltype(make_new_type);
using B = decltype(make_new_type);
using C = decltype(make_new_type);