类模板or继承,还是其它

ithiker 2014-09-20 09:54:22
写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()实现,如果再引入一个基类,则会变成多继承,基本不可行;
大家有没有更好的方案?
...全文
115 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2014-09-20
  • 打赏
  • 举报
回复
加一个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));
ithiker 2014-09-20
  • 打赏
  • 举报
回复
引用 1 楼 jwj070524 的回复:
你是不是需要这样的功能呢?

#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
不错的实现
jwj070524 2014-09-20
  • 打赏
  • 举报
回复
你是不是需要这样的功能呢?

#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

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧