免费注册 查看新帖 |

Chinaunix

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

如何取得模板函数的类型. [复制链接]

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

我想做的是这样的:

  1. callwarper<somefunc>( args...);
复制代码
这个somefunc是一个函数,而callwarper是一个模板或是宏. 当然,不定是<>这种语法了..

比如,如果这样的写的话:

  1. #define WARP(func)   callwarper<typeof(func), &func>::run
  2. template<typename Func, Func *func> class callwarper;
  3. template<typename A1, void(*func)(A1)> class callwraper<void(A1),func>{
  4. public:
  5.    static void run( A1 a1){
  6.       /*some init*/
  7.       func(a1);
  8.       /*some flush*/
  9.     }
  10. };
复制代码
下面再特化有多个参数的...

这样的话,我们就可以如下应用:

  1. void my_func(  float t){
  2.    ...
  3. };

  4. float   t;
  5. WARP(my_func)(t);
复制代码
至于我为何非要做这么麻烦的事呢, 是因为我可以在上面的那个红色部分加一些其它的代码.

论坛徽章:
0
2 [报告]
发表于 2011-02-27 13:33 |只看该作者
这时是能正常运行的, 但是,如果my_func是一个模板就不行了.

比如:
template<typename T>my_func( T t){...}
这是不行的,不能用typeof(my_func<T>)做模板参数.

gcc确实比较怪...
不能用typeof(my_func<T>)做模板参数呢,但(my_func<T>)到底是什么类型呢???

void(*func)(float) = &my_func<float>;  //正确
void(*func)(int)    = &my_func<float>;  //错误
可见,编译器并不是完全不能确认这个类型.

看来原因可能是函数模板可以在有多个参数时,只给出部分,另一部分可以由参数推导.

比如:
template<typename A1, typename A2> A1 cast( A2 a2);
这时,cast<float>是不能确认类型的, 必须经过调用, 那么, cast<float,int>是一定能知道类型的,
编译器也许无法知道所给出的模板参数无法确定类型??

那么, 把模板函数变成模板类会如何呢?? 模板类是由参数唯一确定的...
(不过目前的情况并不乐观..因为我需要让我的代码被nvcc编译过去..nvcc用了edg 4.1, 这个edg看上去不怎么样.  如果这种办法确实不行了, 那么如果谁有hack编译器前端的想法,或是实践, 能否指导一下??)

论坛徽章:
0
3 [报告]
发表于 2011-03-01 08:00 |只看该作者
  1. callwarper<typeof(template <> my_func<T>), &func>
复制代码
可行不?

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
4 [报告]
发表于 2011-03-01 09:42 |只看该作者
太复杂了,没怎么看懂……
LZ是想说某模板的特化函数如果是一个模板函数的话,就特化不了的意思么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP