C++如何在类定义时隐含执行代码?(C/C++反射)

ox_thedarkness 2010-06-08 10:57:36
例:
// C.h 
void f(const char*);
struct C
{
WHAT_EVER_INIT(C);
WHAT_EVER( C, f, test ); // 隐含执行 f("test")。
WHAT_EVER_END(C);
};

// C.cpp
WHAT_EVER_INIT_FOR( C ); // 这行之后需要保证 f("test") 被执行。


可以用宏、模板等,不希望借用 self include 或者代码生成工具
不应在 .cpp 中再写一次同样参数的 WHAT_EVER_CPP( f, "test" );

希望但是不强求:
1 最好保持 sizeof class 大小不变
2 最好保证 f 最多被调用一次

----------------------------------------------

一种实现,例:

#define WHAT_EVER( Class, Func, Str ) struct Tag_##Str { \
Tag_##Str(){ \
Func( #Str ); \
} \
} _tag##Str;


这样 struct C 就变成了
struct C
{
strcut Tag_test{ Tag_test(){ f("test"); } _tag_test;
};

在构造时调用 f。

也算一个可行方案了

缺点是:
1 sizeof C 增大/ 会在每次WHAT_EVER地方增加非 static 成员,破坏内存布局
2 每次C构造时都要执行

------------------------------------
出发点:C/C++ 实现反射和序列化。
- _ - 昨天敲了7小时序列化代码,毫无技术含量的东东,而且想到以后的维护就觉得害怕... 想彻底解决这问题
...全文
436 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
ox_thedarkness 2010-06-10
  • 打赏
  • 举报
回复
好 结贴——
琅琊榜 2010-06-10
  • 打赏
  • 举报
回复
完全看不懂,有啥用 啊
taodm 2010-06-09
  • 打赏
  • 举报
回复
lex/yacc,做这个简单解析,花不了你几分钟的。
ox_thedarkness 2010-06-09
  • 打赏
  • 举报
回复
- - 谢谢CrySleeper和 redleaves

昨天看了下宏递归和 boost::preprocessor
boost::preprcessor 可以用一个宏语句批量生成名称,比如 C::init_tag0; C::init_tag1; C::init_tag2;

但是宏最大的问题是不支持重新定义值,比如无法实现:
#define X 13
INC( X ) // X become 14

如果这个能实现的话,每行 WHAT_EVER 就可以定义一个隐藏的名称自增的静态成员了,进而实现这个要求。

---------------------------------------------------------------
暂时准备采用代码生成的方式,在 .h 文件中做标记,每次编译时先运行外部扫描程序 生成额外的.cpp,类似
__rtti(auto, def=0.0f)  float c;
__rtti(auto, nodef) MyType ar[30];


- _ -) 缺点是得做手动字符串解析... 括号匹配 ... 支持 const,数组等等... 估计不会完备
如果明天早上还没啥看到更好方案的话 就结贴
ox_thedarkness 2010-06-09
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 redleaves 的回复:]

引用 33 楼 ox_thedarkness 的回复:
如果这个能实现的话,每行 WHAT_EVER 就可以定义一个隐藏的名称自增的静态成员了,进而实现这个要求。

VC中有一个计数器的宏.每用一次,值加1...
[/Quote]
- 。 - 那个的当前值不能传给另一个宏 也不能重置计数...
chaoliu1024 2010-06-09
  • 打赏
  • 举报
回复
up~
redleaves 2010-06-09
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 ox_thedarkness 的回复:]
如果这个能实现的话,每行 WHAT_EVER 就可以定义一个隐藏的名称自增的静态成员了,进而实现这个要求。
[/Quote]
VC中有一个计数器的宏.每用一次,值加1...
ox_thedarkness 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 taodm 的回复:]
不要在C、C++里折腾反射。如果真需要,就换编程语言。
[/Quote]
[Quote=引用 3 楼 forestdb 的回复:]
换个语言
开发个语言
[/Quote]
嘛 现在情况是,核心是C/C++,不管在外部用什么语言,有一个700行+ 的结构肯定是维护他的成员名/值对应关系的。 - _ -) 现在是手动写代码维护,我是想看看有没有什么奇思妙想能搞定。 老实说这问题肯定是很常见的。
baihacker 2010-06-08
  • 打赏
  • 举报
回复

//自己转为宏。

struct CODE
{
CODE()
{
struct x
{
static void f(const char* str)
{
cout << str << endl;
}
x()
{
f("test");
}
};

static x x;
}
};

struct fuck : CODE
{
};
int main()
{
fuck fuckable;
fuck fuckable1;
return 0;
}
liutengfeigo 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mydo 的回复:]

哎...维护啊...
[/Quote]
其他22连冠~
zhongpingjun 2010-06-08
  • 打赏
  • 举报
回复
天天向上
yunyun1886358 2010-06-08
  • 打赏
  • 举报
回复
没懂搂主的意思。
ForestDB 2010-06-08
  • 打赏
  • 举报
回复
换个语言
开发个语言
taodm 2010-06-08
  • 打赏
  • 举报
回复
不要在C、C++里折腾反射。如果真需要,就换编程语言。
大熊猫侯佩 2010-06-08
  • 打赏
  • 举报
回复
哎...维护啊...
redleaves 2010-06-08
  • 打赏
  • 举报
回复
#include <stdio.h>
#define WHAT_EVER_INIT( type ) static int _init_##type() {
#define WHAT_EVER( type, func, arg ) func##( #arg );
#define WHAT_EVER_END( type ) return 0;}
#define WHAT_EVER_INIT_FOR( type ) namespace { int _dummy = type::_init_##type(); }

void test( const char *arg ) {
printf( "%s\n", arg );
}
class abc {
public:
abc() {
}
WHAT_EVER_INIT(abc)
WHAT_EVER(abc, test, args )
WHAT_EVER_END(abc)
};
WHAT_EVER_INIT_FOR( abc )
int main() {
return 0;
}

此方案可以满足楼主最开始的要求.呵呵
healer_kx 2010-06-08
  • 打赏
  • 举报
回复
c + pYTHON 就很好嘛。。。
a281458177 2010-06-08
  • 打赏
  • 举报
回复
牛人很多 来学习一下
cattycat 2010-06-08
  • 打赏
  • 举报
回复
有点高深了,属于c++ 反射机制了。只能路过了。
CrySleeper 2010-06-08
  • 打赏
  • 举报
回复
高了半天没搞出来,等高手吧
加载更多回复(18)

64,652

社区成员

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

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