A C++ smart_ptr proof of concept that solves the template covariance problem through template metaprogramming