Chinaunix

标题: 带条件的强制类型转换如何写? [打印本页]

作者: newbuding    时间: 2010-06-09 15:41
标题: 带条件的强制类型转换如何写?
本帖最后由 newbuding 于 2010-06-10 15:41 编辑

有3个结构体,中有小部分成员相同
结构体a与结构体b为实类,结构体c为共同类,可以替代a或b。
当然结构体a和b不会像下面这么简单。
  1. struct a {
  2.   int type;
  3.   int count;
  4. };

  5. struct b {
  6.   int type;
  7.   int count;
  8. };

  9. struct c {
  10.   int type;
  11.   char data[max(sizeof(struct a),sizeof(struct b))-sizeof(int)];
  12. };
复制代码
能否实现宏ZZ(),或者函数ZZ()

  1. struct a test_a = { 1, 100};
  2. struct b test_b = { 2, 200};
  3. struct c test_c = (struct a)test_a;
  4. printf("%d\n", ZZ(test_c).count++);
复制代码
可以实现:根据type的不同,处理成不同的结构体。
作者: newbuding    时间: 2010-06-09 16:22
本帖最后由 newbuding 于 2010-06-10 15:41 编辑

关键就是最后一句

  1. printf("%d\n", ZZ(test_c).count++);
复制代码
要ZZ返回的是变量,而不是值,如何搞啊?
作者: 没本    时间: 2010-06-09 18:44
为啥要用结构而不用联合?
作者: EricFisher    时间: 2010-06-09 20:52
#define ZZ(x)   (&x)
作者: bill15    时间: 2010-06-09 20:59
如4L,传地址然后判断type进行处理
作者: newbuding    时间: 2010-06-10 00:11
如4L,传地址然后判断type进行处理
bill15 发表于 2010-06-09 20:59



    关键的就是如何判断type,并继续处理?
而且处理后仍为变量,而不是值,允许对变量做进一步操作
作者: newbuding    时间: 2010-06-10 00:15
为啥要用结构而不用联合?
没本 发表于 2010-06-09 18:44



不用联合是因为:
我只知道剩余变量所占的大小,而不一定知道变量的名字
作者: ehust_cu    时间: 2010-06-10 00:27
这个数据结构的抽象是有问题的,count既然不是共有的属性,为啥要通过struct c来改变
作者: newbuding    时间: 2010-06-10 10:31
这个数据结构的抽象是有问题的,count既然不是共有的属性,为啥要通过struct c来改变
ehust_cu 发表于 2010-06-10 00:27


为什么说不是共有的属性呢?
结构体a和b都有count啊,只不过现实中可能count的类型不一样。
例如count有可能是int型的,还有可能是个double型的,或者是个struct。
作者: 没本    时间: 2010-06-10 12:22
介绍一下其他的设计方案。
C的话有 VARIANT ,微软用于OLE/ActiveX
C++的话,Boost.Any和Boost.Variant
作者: newbuding    时间: 2010-06-10 12:53
回复 10# 没本


    我在Linux下,不用MFC啊
作者: newbuding    时间: 2010-06-10 15:31
回复 1# newbuding

CU里高手如云,难道没有人能解决我的问题吗?
作者: ehust_cu    时间: 2010-06-10 18:50
回复 9# newbuding
是共有的属性为啥不放在struct c里面呢
作者: EricFisher    时间: 2010-06-10 20:05
> printf("%d\n", ZZ(test_c).count++);

首先,struct c 里面没有count这个域,这句代码不能保证是正确的。
作者: starwing83    时间: 2010-06-10 22:44
你直接说想做什么吧,随便说个糟糕设计一般情况下很难有优雅的实现的。
作者: newbuding    时间: 2010-06-11 00:52
> printf("%d\n", ZZ(test_c).count++);

首先,struct c 里面没有count这个域,这句代码不能保证是正确的 ...
EricFisher 发表于 2010-06-10 20:05



是的,struct c里面并没有count这个域,我想要的就是让ZZ()这个函数或者宏,通过强制类型转换为struct a或者struct b
来取得其中的count域

至于到底是应该转成a还是b,取决于其中的type

也许这么设计并不优雅,但是类似于 struct sockaddr,就是为了实用些
作者: ehust_cu    时间: 2010-06-11 12:52
既然要模仿sockaddr就要看下使用的场景,你这个场景跟sockaddr不同,你见过这么用sockaddr吗?
作者: EricFisher    时间: 2010-06-11 22:34
还有一个问题,在于,ZZ()的返回值的类型是不固定的,可能为struct a也可能是struct b。这个问题如何解决?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2