在Symbian和CE下开发,来提高生活的质量;在Windows和Linux下开发,来增添生活的色彩。在我的生活中只有一种颜色--黑色

用虚函数实现定义不同模板参数的同一个模板类对象

上一篇 / 下一篇  2006-10-14 21:58:24 / 天气: 晴朗 / 心情: 高兴

  要用自己的输入来定义同一个模板类对象,比如,我输入一个整数i,通过i值得不同,来定义不同模板参数的同一个模板类对象。用switch语句只能定义不通的模板类对象,这个行不通。那如果用宏编译#ifdef  #endif对呢,形如;
template<class T> class base{...}
......
scanf(%d,&i)
switch(i)
case 1:{#define a break;};
case 2:{#define b break;};
......

#ifdef a
base<int> abc;
#ifdef b
base<float> abc;
....
#endif
这样行吗?很显然也是行不通的,因为你定义了相同的类对象,编译通不过。怎么办?
  幸好c++给我们提供了虚函数,它可以迟后联编,就是在运行的时候,根据类对象来编译对应的虚函数。好的,试试看行还是不行。
template<class T> class base{...}

class type_any
{
public:
vitual base* foo()=0
}
class type_int:public type_any

{
public:
virtual base* foo()
{
return new base<int>;
}
....
}

class type_float : public type_any
{
public:
virtual base* foo()
{
  return new base<float>;
}
.....
}
......
base* fun(type_any &m)
{
return m.foo;
}
type_any choose(int n)
{
  switch(n)
  case 1:
  {
    type_int le1;
    return le1;
  };
  case 2:
  {
    type_float le2;
    return le2;
   };
......
}

viod main()
{
  void*p;
  int i;
  cout<<"input i:"<<endl;
  cin>>"%d",>>i;
  p=(viod*)fun(choose(i));
.....
.....
}
千万别忘了在类中定义在堆中撤销base类的成员函数。这样就可以实现根据自己的输入,来定义不同模板参数的同一个模板类对象。*p就是模板类对象,根据不同的输入,指针p指的内容不同。也可以这样:
template<class T> class base{...}

class type_any
{
public:
vitual viod foo()=0
}
class type_int:public type_any

{
public:
virtual viod foo()
{
   static base<int> abc;
}
....
}

class type_float : public type_any
{
public:
virtual void foo()
{
   static base<float> abc;
}
.....
}
......
base* fun(type_any &m)
{
return m.foo;
}
type_any choose(int n)
{
  switch(n)
  case 1:
  {
    type_int le1;
    return le1;
  };
  case 2:
  {
    type_float le2;
    return le2;
   };
......
}

viod main()
{
  int i;
  cout<<"input i:"<<endl;
  cin>>"%d",>>i;
  choose(i);
.....
.....
}
静态变量abc就可以使用了,根据不同的输入,abc模板类对象的模板参数也不同。
  这是有一个会员问我的,我也不知道这样有什么好处。这是我初步的构思,我觉得要实现向我上面说的,还可以优化。因为c++的功能实在是太强大了。
  大家一起讨论,不知道我的想法对不对。


TAG: 情感绿洲

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-29  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 2160164
  • 日志数: 1
  • 图片数: 2
  • 建立时间: 2006-08-26
  • 更新时间: 2006-12-05

RSS订阅

Open Toolbar