背景
相信很多和我一样从习惯了使用Java的lombok自动生成set/get方法,但是到了C++却只能自己一个一个写,那么C++就没有相关的方法了吗?答案当然不是,C++可以使用宏来实现类似的功能,那么今天我就来记录一下如何在C++中用宏实现set/get功能。
具体使用方法
在我做项目的实践过程中,无意间发现VTK中有set/get的实现,俗话说,它山之石可以攻玉,更不要说VTK这种大型的开源项目了,有兴趣的可以去下载源码,里面许多C++的用法都值得借鉴。
首先我来到了set/get头文件,忽略掉预编译和版本适配的内容,核心内容如下:
#define vtkSetMacro(name, type) \
virtual void Set##name(type _arg) \
{ \
\
if (this->name != _arg) \
{ \
this->name = _arg; \
\
} \
}
#define vtkSetMacroOverride(name, type) \
void Set##name(type _arg) override \
{ \
\
if (this->name != _arg) \
{ \
this->name = _arg; \
\
} \
}
//
// Get built-in type. Creates member Get"name"() (e.g., GetVisibility());
//
#define vtkGetMacro(name, type) \
virtual type Get##name() const \
{ \
\
return this->name; \
}
可以看到你要给宏传递一个参数名和参数类型,get里面还有const注意这个细节,就是不让你改成员的值。甚至他还是一个虚函数,为子类还提供了override的函数。具体可以看我下面如何使用的。
这个文件是我编译过的,可以直接使用,比如我就用一个类测试了这个set/get宏,如下
#include "SetGet.h"
#include<iostream>
#include<string>
class Test1{
public:
vtkSetMacro(a, std::string);
vtkGetMacro(a, std::string);
std::string a;
};
class Test1Child: public Test1{
vtkSetMacroOverride(a, std::string);
};
int main(){
Test1 t;
t.Seta("10220");
std::cout << t.Geta();
return 0;
}
程序的输出是:
符合设定。
我的环境是mac os ventura,xcode 14。
总结
如果自己的项目有很多的属性设置,需要使用set/get,那么可以把我上面的代码直接复制到项目中。
在源代码中还有设置enum的,可以自己去慢慢研究。
引用
https://gitlab.kitware.com/vtk/vtk/-/blob/master/Common/Core/vtkSetGet.h