我想定义一些属性,例如:
#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。
我想定义一些属性,例如:
#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。
正如评论所说,你不能那样做。预处理器不做那些事情。
因此,您要么遵循@Shahbaz 在第一条评论中所说的内容,要么做类似的事情,让您得到、设置get_count
和set_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;
}
请注意,变量是在private
节中声明的,其名称是m_count
,并且函数在节中定义(不仅是声明的)public
。
或者,您可以通过Count
而不是count
在宏中传递:
property(int, Count);
如果你这样做,那么你可以创建变量 asm_Count
和函数 asgetCount
和setCount
。这是最接近你想要的。
没有办法(据我所知)使用 C 预处理器来做到这一点。我建议作为一种折衷方案,您选择下划线并使用get_count()
易于阅读的内容。其他选择:
m4
作为第一步进行调查。这绝对是可能的,m4
因为我做了一些非常相似的事情。也就是说,对于您想要实现的目标来说,这似乎有点复杂。#define property(T, x, name)
单独指定名称。它更灵活,但又可能不是您想要的。最后的两个观察:虽然这样写似乎更有效,但请记住,任何维护您的代码的人都可能会搜索setCount()
但找不到它,这会浪费时间,直到他们弄明白您做了什么。即从代码维护的角度来看,保持简单。其次,用大写表示宏是一种很好的做法,因为这样很容易识别它们。同样,这在您维护代码时确实很有帮助。