Template Metaprogramming vs constexpr

Before constexpr functions existed, how was compile-time computation typically achieved in C++?