【发布时间】:2022-01-25 06:13:24
【问题描述】:
最近我开始思考如何通过名称的通用类/函数来通用对私有数据成员的访问。原因是我有很多私人成员,为每个成员创建一个吸气剂很麻烦。我尝试使用预处理器宏来执行以下操作
#define RETURNS(...) -> decltype((__VA_ARGS__)) { return (__VA_ARGS__); }
#define GET(classname, name, funcname) auto funcname() RETURNS(classname->name);
class foo {
private:
int a = 1;
std::vector<int> b = std::vector<int>(3, 1);
std::string c = "pika-chuuu";
public:
foo() = default;
~foo() = default;
GET(this, a, getter);
};
int main(const int argc, char* argv[]) {
foo obj;
std::cout << obj.getter();
return 0;
}
这个可以编译,但是有没有办法可以在foo 中创建一个getter,它在运行时获取一个变量的名称并返回this->(name)?使用这种方法,我可以减少引入 getter 的代码,但是数据成员越多,我需要的 getter 就越多,但我希望有一个可以按名称访问任何数据成员的权限。你有什么建议可以做到吗?
我正在寻找这样的语法:
#define RETURNS(...) -> decltype((__VA_ARGS__)) { return (__VA_ARGS__); }
#define GET(classname, name) RETURNS(classname->name);
class foo {
private:
int a = 1;
std::vector<int> b = std::vector<int>(3, 1);
std::string c = "pika-chuuu";
public:
foo() = default;
~foo() = default;
auto getter(auto x) GET(this, x);
};
这里 x 是我输入的名称,a,b 或 c
【问题讨论】:
-
对 getter 的严重依赖通常表明设计缺乏抽象。您是否尝试过从另一个角度解决问题,质疑为什么需要这么多?
-
@molbdnilo 在我的设计中,a 有很多成员,用户本身应该无法访问,所以我宁愿省略让它们公开。我使用的 getter 返回值或对 const 对象的引用,因此用户无法更改它们,但他可能需要对特定字段的副本或引用。一种方法是将所有这些参数打包到一个结构中并为该结构创建一个 getter,但这在实现中可能会变得很麻烦,将 this->var 重写为 this->structname.var 等。
-
拥有大量成员再次表明设计存在缺陷。为什么其他参与者需要访问他们中的所有?也许某些成员应该是其他类的成员?而且,使用宏几乎没有是解决设计问题的方法。更频繁地简化类是,
-
@BoP “也许有些成员应该是其他类的成员?”你的意思是定义一个结构来保存我需要getter的那些数据成员?如果可以更改它,我将尝试查看设计,将成员分离到其他类(3 个类继承自具有这些成员和 getter 的基类)。无论如何,有没有办法定义这样的函数?
-
你的意思是定义一个结构来保存我需要 getter 的那些数据成员? 不,我的意思是如果其他一些类经常需要获取一些值,也许那些相反,值属于该其他类。有一些 getter 是可以的,需要 许多 getter 是可疑的。
标签: c++ getter preprocessor