类模板or继承,仍是其它

类模板or继承,还是其它
写3个类似的类,类的参数M,N,T类型完全不同,也没有继承关系,含有同样的接口Handle(接口没有统一的形式,各自的操作差异化很大),如下

class BBB:public PPP
{
        public:
                      BBB(M& m);
        public:
        void     Handle(){//M related operation};
}

class CCC: public PPP
{
        public:
                      CCC(N& n);
        public:
        void     Handle(){//N related operation};
}
class DDD : public PPP
{
        public:
                      DDD(T& t);
        public:
        void     Handle(){//N related operation};
}

如果采用类模板方式做的话,所有的Handle方法在实例化类的时候都要重写,没有类似于Quene<int>, Quene<string>的使用类模板那样直观便捷;
如果采用继承加虚函数做,因为目前本身有一层继承并且Handle()方法是基类的Handle()实现,如果再引入一个基类,则会变成多继承,基本不可行;
大家有没有更好的方案?
------解决思路----------------------
你是不是需要这样的功能呢?

#include <iostream>

template <class _Tp>
class Sometype
{
public:
  void Handle() { std::cout << "General handler\n"; }
private:
  _Tp data_;
};

template <> void Sometype<int>::Handle()
{
  std::cout << "int handler\n";
}

template <> void Sometype<double>::Handle()
{
  std::cout << "double handler\n";
}

int main ()
{
  Sometype<char>    inst0;
  Sometype<int>     inst1;
  Sometype<double>  inst2;

  inst0.Handle();
  inst1.Handle();
  inst2.Handle();
  return 0;
}

Output

C:\Users\WJJ\Desktop>g++ -g -Wall test.cpp

C:\Users\WJJ\Desktop>a.exe
General handler
int handler
double handler

------解决思路----------------------
加一个handle方法

template<typename T>
void Handle(T&& t){
   t.Handle();
}
template<typename M>
class BBB//:public PPP
{
        public:
                      BBB(M& m);
        public:
        void     Handle(){//M related operation};
}
 template<typename N>
class CCC//: public PPP
{
        public:
                      CCC(N& n);
        public:
        void     Handle(){//N related operation};
}
template<typename T>
class DDD //: public PPP
{
        public:
                      DDD(T& t);
        public:
        void     Handle(){//N related operation};
}
template<typename T>
DDD<T> makeDDD(T& t){
 return DDD(t);
}
std::string s = "hello";
Handle(makeDDD(s));
int a = 5;
Handle(makeDDD(a));