免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1350 | 回复: 4
打印 上一主题 下一主题

请教大牛一个模板的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-20 16:16 |只看该作者 |倒序浏览
本帖最后由 AD8018 于 2012-02-20 16:21 编辑

  1. template<class T1>
  2. void test(T1 *p1)
  3. {
  4. }

  5. struct B1
  6. {
  7.         virtual void func() = 0;
  8. };

  9. struct C1 : public B1
  10. {
  11.         virtual void func()
  12.         {
  13.                 test(this);
  14.         }
  15. }

  16. int main()
  17. {
  18.         C1 c1;
  19.         B1 *b1 = &c1;
  20.         b1->func();                //此处将调用 test<C1>(&c1);
  21.        
  22. }
复制代码
以上为一个简单的虚函数调用,从基类得到了继承类的指针。

现在想将借助虚函数,得到两个继承类的指针,能做到吗?

  1. template<class T1, class T2>
  2. void test(T1 *p1, T2 *p2)
  3. {
  4. }

  5. struct B1
  6. {
  7.         //....
  8. };

  9. struct C1 : public B1
  10. {
  11.         //....       
  12. }

  13. struct B2
  14. {
  15.         //....
  16. };

  17. struct C2 : public B2
  18. {
  19.         //....
  20. }

  21. int main()
  22. {
  23.         C1 c1;
  24.         C2 c2;       
  25.         B1 *b1 = &c1;
  26.         B2 *b2 = &c2;       
  27.                        
  28.         //之前通过虚函数b1->func(),达到了调用 test<C1>(&c1) 的效果,
  29.         //想推广到两个基类,
  30.         //如何通过b1, b2,达到调用 test<C1,C2>(&c1, &c2) 的效果
  31.         //只能通过基类实现,不能写出C1或C2,不晓得有办法没?
  32. }
复制代码

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2012-02-20 18:12 |只看该作者
与模板无关,需要的是多分派的能力。 BS有提议过,不过没被采纳……

貌似语法是这样:

  1. void f(virtual B1* b1, virtual B2* b2) { ... }
  2. void f(B1* b1, C2* c2) { ... }
  3. void f(C1* c1, B2* b2) { ... }
  4. void f(C1* c1, C2* c2) { ... }

  5. C1 c1;
  6. C2 c2;
  7. B1* b1 = &c1;
  8. B2* b2 = &c2;
  9. f(b1, b2);
复制代码
根据多个多态参数分派到f(C1*,C2*),f(C1*,C2*)里就取回真实类型,test什么的就是小事了。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
3 [报告]
发表于 2012-02-20 18:17 |只看该作者
回复 1# AD8018

不过直到C++11都不支持的……
只能人肉实现,比如dynamic_cast…… 或者vistor pattern……

lz你到底是想干嘛……  这虚函数与模板的结合有点诡异……

论坛徽章:
0
4 [报告]
发表于 2012-02-20 19:18 |只看该作者
OwnWaterloo果然厉害,就是要这个多分派的能力。

我想给 boost::any 加个any_dynamic_cast
想来想去,只要能多分派就能实现。

如果模板函数可以支持虚函数,也能实现。但现实不那么美好。

struct C1 : public B
{
   ...
};

struct C2 : public B
{
   ...
};

C1 c1;
C2 c2;
boost::any arr[2];
arr[0] = c1;
arr[1] = c2;

for(i = 0; i < 2; ++i)
{
     B *p = any_dynamic_cast<B *>(&arr[i]);
}

论坛徽章:
0
5 [报告]
发表于 2012-02-20 19:25 |只看该作者
boost,笑而不语
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP