to improve build time (to move all code to .cpp) to reduce template footprint (to reduce binary size and compile time too)