模板推导问题,由成员推导成员类型

nooning 2011-05-06 10:49:50
class C1{
public:
int V1;


template<typename Ty, typename Ty C1::* Var>
Ty getvalue()
{
....
}

}

C1 c1;
c1.getvalue<int,&C1::V1>();
请问如果定义可以变成
c1.getvalue<&C1::V1>();

问题也就是说如果由成员推导出成员的类型。

问题比较初级,高手不吝赐教
...全文
256 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
nooning 2011-11-08
  • 打赏
  • 举报
回复
回一句,给其它需要些问题答案的朋友们

此问题直到c++0x 标准还没有解决,所以可能目前还不能写的如此优雅。

不过c++0x中有一些技术可以一定程度上解决类似问题
nooning 2011-08-31
  • 打赏
  • 举报
回复
这么久还有人跟。。。太感动了。。。

这个后来可能已经解决了。。。

看过高手们的代码才知道,没有不可能,只有想不到。。。

看上去编译器完成不了的,别人却也能实现,在此向那些工作在开源战线上的同僚们致以崇高的敬意
johnson3d 2011-07-23
  • 打赏
  • 举报
回复
楼主,我以前也钻过类似牛角尖,希望编译器在知道变量类型的时候,能告诉我,但后来觉得是一个死胡同,就没去深入思考了,呵呵,也许我功力有限吧。如果真能拐弯实现,麻烦告诉我一下哦
johnson3d 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 taodm 的回复:]
楼主啊,如果你真要做这么大工程,或者真这么好学,去买本《C++ templates》宝典认真看看吧,貌似你语法基础还缺很多。
[/Quote]
说实话,上面的代码是在没看出楼主语法基础欠缺,倒是您那个“c1.getvalue(&C1::V1);即可。
” 回复是过不去的
pengzhixi 2011-05-06
  • 打赏
  • 举报
回复
class C1{
public:
int V1;


template<typename T>
void getvalue(T a)
{
cout<<a<<endl;
}

};

C1 obj;
obj.getvalue(obj.V1);
有必要那么复杂吗
itslmde 2011-05-06
  • 打赏
  • 举报
回复
这样不行吗???

template <class T, class C>
T type(T C::*)
{
cout << typeid(T).name() << endl;
}

nooning 2011-05-06
  • 打赏
  • 举报
回复
to pengzhixi:

提供参数为 类成员,由类成员推导出成员类型。
pengzhixi 2011-05-06
  • 打赏
  • 举报
回复
额 模板类是你自己显示给出模板参数来实例化,而模板函数则可以根据参数来推导,你这里既不作为函数参数那么就没办法推导了。那就只能显示给出模板参数了,仅此而已。
nooning 2011-05-06
  • 打赏
  • 举报
回复
TO dizuo:
我正在使用boost库,boost traits没看出有这个功能,能否给个实例,谢谢,就楼顶的简单示例就好,万分感谢
nooning 2011-05-06
  • 打赏
  • 举报
回复
也可以这么说吧,需要通过模板的,不传函数参数
itslmde 2011-05-06
  • 打赏
  • 举报
回复
如果仅仅是得到成员变量的类型的话,哪里要这么复杂呢?

单纯传递&C1::V1 做普通的值推导不就行了。
ryfdizuo 2011-05-06
  • 打赏
  • 举报
回复
lz,说白了,你想要的就是 萃取成员变量指针的类型吧。
nooning 2011-05-06
  • 打赏
  • 举报
回复
区别大了,如果作为参数,那只生成一个函数或一类函数,如果成员地址作为一个模板参数就会根据不同的成员生成不同的函数。在消息分发等情况下就需要生成函数列表,这是非常有效并能简化代码的实现
ryfdizuo 2011-05-06
  • 打赏
  • 举报
回复
4楼陶大妈说的就是。
成员变量指针作为getvalue参数。你这个模板函数设计很别扭,函数模板是通过参数的类型去执行推导。。
taodm 2011-05-06
  • 打赏
  • 举报
回复
你自己想想清楚吧,作为模板参数和作为函数参数,都是参数,都是填一个值,有真正的区别么。
nooning 2011-05-06
  • 打赏
  • 举报
回复
to taodm:
那变成变量不成再作为模板参数,也不能用于生成函数列表的情况,那需要传参实现

实现方式不同了
nooning 2011-05-06
  • 打赏
  • 举报
回复
TO dizou:

问题不是返回值,我希望通过成员变量地址得到这个成员的类型。

template<typename Ty,typename Ty C1::*var>
void xxx(){
Ty xxxx;
}
像你上面的代码,就变成了
template<typename int C1::*var> void xxx(){}

或者特化成 不同的类型包括 int
template<typename int C1::*var> xxx<int,var>(){}

我想希望能简化代码,直接通过成员得到类型
nooning 2011-05-06
  • 打赏
  • 举报
回复
to Dizou:
这还是没有解决那个问题

我是需要
问题的你的Ty 被固定了,如果那么写与

template<typename int C1::* Var>void xxx(){}
就等价了
现在需要
template<typename Ty,typename Ty C1::* Var>
void xxx(){
Ty xxx;
}
主要是要根据成员变量得到类型,是否返回值不重要

taodm 2011-05-06
  • 打赏
  • 举报
回复
c1.getvalue(&C1::V1);即可。
ryfdizuo 2011-05-06
  • 打赏
  • 举报
回复
template<typename Ty, typename Ty C1::* Var>
Ty getvalue()
====================
你这是要根据模板参数推导返回值类型啊。
函数模板只能推导参数类型,不能推导返回值类型,boost中基于trait技术实现了返回值推导。
class C1{
public:
int V1;
typedef int Ty;

template<typename Ty C1::* Var>
typename C1::Ty getvalue()
{
}

};
加载更多回复(10)

64,648

社区成员

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

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