创建宏来为任何c++类生成getter
Create macro to generate getters for any class c++
最近,我开始思考如何通过通用类/函数的名称来通用对私有数据成员的访问。原因是我有很多私人成员,为每个成员创建一个getter很麻烦。我尝试使用预处理器宏来完成以下
#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就越多,但我希望有一个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
你对如何做到这一点有什么建议吗?
为什么所有的decltype
和->
以及带有__VA_ARGS__
和RETURNS
的可变宏。。。只是:
#include <vector>
#include <string>
#define DECL_GETTER(name)
auto get_##name() { return this->name; }
class foo {
private:
int a = 1;
std::vector<int> b = std::vector<int>(3, 1);
std::string c = "pika-chuuu";
public:
DECL_GETTER(a)
DECL_GETTER(b)
DECL_GETTER(c)
};
int main() {
foo f;
f.get_a();
f.get_b();
f.get_c();
}
我也会添加const
过载。
你可能想研究QT属性系统,这基本上是一个更高级的版本。
主观:TBH有了这样一个宏,你就在不需要它们的地方进行抽象。值得花时间吗?它用不明显的宏隐藏了一些明显的代码,使得IDE"跳转到定义";更难,使维护和推理变得更加困难。使用IDE功能重命名变量将更加困难。考虑一下逐字逐句地手工编写这些getter——考虑一下可读清晰的代码,这在第一眼就很明显,即使你不得不牺牲一点重复,并键入更多的() { return
字符。配置您的IDE,这样您就可以拥有";为这个成员函数创建一个getter/setter;加速开发的操作(例如,请参阅QTCreator,这是一个非常好的功能(。
有没有一种方法可以在foo中创建一个getter,它在运行时使用变量的名称并返回这个->(姓名(?
C++是一种没有反射的语言,所以基本上没有,或者它需要比实际更多的样板代码。
修订:
正如@HolyBlackCat所提到的,不需要堆分配,应该直接使用impl
类作为对象:
class foo{
struct foo_data
{
int i;
std::string s;
};
foo_data data;
public:
template<typename ... Args>
foo(Args&& ... args)
: data(std::forward<Args>(args)...)
{}
foo_data const* operator->() const // Returns a pointer to const data
{
return &data;
}
};
然后访问数据:
int main()
{
auto f = foo(3, "hello");
std::cout << f->i << f->s; // Accessing data, prints: "3hello"
// f->i += 1; // Error: assignment of member in read-only object
}
- 如何通过 getter 函数删除矢量的元素?
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 如何为 C 型字符串数组编写 getter 和 setter?
- C++ Setter/Getter,cout 工作,printf 失败
- 指向成员函数的模板指针 - getter
- 使用 getter 访问成员变量C++
- 如何在节点插件中创建 getter?
- 即使有 0 个错误,Getter 似乎也会使程序崩溃
- 将值推送到 getter 函数调用的列表中时出现问题
- 为什么我的编译器在调用 const getter 函数时抛出"转换丢失(const)限定符"错误?
- 私有变量无法正常工作的C++getter方法(只有Java经验)
- 如何使用 getter 功能push_back列表?
- 常量和非常量 getter 具有相同的名称
- 不一定获得成员价值的 getter 方法?
- 在 c++ 中使用 getter 作为unordered_map会创建大小为 8 的无效读取
- Getter 和 Setter 用于类 C++ 中的数组元素
- 无法使用在子类中定义的虚拟getter实现基类
- 如何编写C++getter和setter
- 如何为包含另一个类实例的数组制作常量 getter?
- 为什么叮当格式在 getter 的大括号之前不会中断?