struct Null { }; template struct Cons { Car car; Cdr cdr; }; constexpr Null null = Null {}; template constexpr Cons cons(const Car &car, const Cdr &cdr) { return Cons {car, cdr}; } constexpr int length(const Null &p) { return 0; } template constexpr int length(const Cons &p) { return 1 + length(p.cdr); } constexpr auto foo = length(cons(3,cons(2,null))); #include int main() { std::cout << foo << std::endl; }