Work still in progress. separate templates to avoid cross/unnecessary
instanciations. template classes rather than template functions to
explicit instantiation and avoid overloading rules confusion