类模板or继承,仍是其它
类模板or继承,还是其它
写3个类似的类,类的参数M,N,T类型完全不同,也没有继承关系,含有同样的接口Handle(接口没有统一的形式,各自的操作差异化很大),如下
如果采用类模板方式做的话,所有的Handle方法在实例化类的时候都要重写,没有类似于Quene<int>, Quene<string>的使用类模板那样直观便捷;
如果采用继承加虚函数做,因为目前本身有一层继承并且Handle()方法是基类的Handle()实现,如果再引入一个基类,则会变成多继承,基本不可行;
大家有没有更好的方案?
------解决思路----------------------
你是不是需要这样的功能呢?
Output
------解决思路----------------------
加一个handle方法
写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));