浏览 1443 次
锁定老帖子 主题:C 的 attr_accessor
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-03
最后修改:2009-06-03
如 #define attr_accessor(klass, attr) \ rb_define_method(klass, #attr, RUBY_METHOD_FUNC(attr), 0);\ rb_define_method(klass, (#attr"="), RUBY_METHOD_FUNC(attr##_eq), 1); 则 attr_accessor(S1, name); 会被展开成 rb_define_method(S1, "name", RUBY_METHOD_FUNC(name), 0); rb_define_method(S1, "name=", RUBY_METHOD_FUNC(name_eq), 1); 变长度 attr_accessor 呢? C 的 macro 没法做递归,所以得用另一门语言做预处理…… 如 ruby。 个数到 16 个应该足够了…… File.open 'attr_accessors.h', 'w' do |f| f.puts <<-ES #define attr_accessor(ty, a) \ private:\ ty a;\ public:\ void set##a(ty a) {this->a = a;}\ ty get##a(void) {return this->a;} ES params = [] mname = '#define attr_accessor%d(ty, %s) \\' mline = 'attr_accessor(ty, %s)' (2..16).each do |i| params << "a#{i}" f.puts (mname % [i, params.join(',')]) f.puts (params.map{|e| mline % e}.join "\\\n") end end #include "attr_accessors.h" class Dragon { attr_accessor4(int, hp, mp, exp, attack) }; ruby MRI 用了很多类似这样的东西…… 先编译出一个 miniruby.exe,然后用 miniruby 做代码生成,再编译。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |