6

我想定义一些属性,例如:

#define property(T, x) T x; T get ## x (); void set ## x (T value);

class foo { 
public: 
  property(int, count);
  property(float, size);
}

但我希望方法被称为 getCount/setCount 而不是 getcount/setcount。

4

2 回答 2

7

正如评论所说,你不能那样做。预处理器不做那些事情。

因此,您要么遵循@Shahbaz 在第一条评论中所说的内容,要么做类似的事情,让您得到、设置get_countset_count形成。

#define property(T, x) private : T m_## x; \
public : T get_## x () { return m_## x;} \
void set_## x (T value) { m_## x = value; }

class foo { 
public: 
  property(int, count);
  property(float, size);
};

int main() {
        foo f;
        f.set_count(10);
        std::cout << f.get_count() << std::endl;
        return 0;
}

ideone 的快速演示

请注意,变量是在private节中声明的,其名称是m_count,并且函数在节中定义(不仅是声明的)public

或者,您可以通过Count而不是count在宏中传递:

 property(int, Count);

如果你这样做,那么你可以创建变量 asm_Count和函数 asgetCountsetCount。这是最接近你想要的。

于 2012-04-19T14:43:39.290 回答
3

没有办法(据我所知)使用 C 预处理器来做到这一点。我建议作为一种折衷方案,您选择下划线并使用get_count()易于阅读的内容。其他选择:

  • 如果您真的想坚持使用预处理器,您可以m4作为第一步进行调查。这绝对是可能的,m4因为我做了一些非常相似的事情。也就是说,对于您想要实现的目标来说,这似乎有点复杂。
  • 添加一个额外的参数,以便您可以#define property(T, x, name)单独指定名称。它更灵活,但又可能不是您想要的。
  • 如果它真的只是创建访问器/修改器的跑腿工作,那么有很多 IDE 和代码生成器可以为您完成它,或者您可以编写一些 shell / Python / Perl 来轻松地将它作为一个整体来解决。

最后的两个观察:虽然这样写似乎更有效,但请记住,任何维护您的代码的人都可能会搜索setCount()但找不到它,这会浪费时间,直到他们弄明白您做了什么。即从代码维护的角度来看,保持简单。其次,用大写表示宏是一种很好的做法,因为这样很容易识别它们。同样,这在您维护代码时确实很有帮助。

于 2012-04-19T14:42:39.303 回答