如何避免编写样板访问器代码
How to avoid having to write boilerplate accessor code
我发现,在编码C++代码时,我花了很多时间编写访问器样板代码,例如:
class A
{
int x;
public:
auto x();
void set_x(decltype(x));
};
实现访问器的整个想法围绕着能够拦截对它们的读取和写入访问。我偶然发现了这个库(我不是作者)。这真的让我想知道,为了避免编写样板代码,是否可以/应该写这样的东西:
class A
{
public:
property<int> x;
A() {
x.setter([this](int){ /* setter code */ });
}
};
我的问题是:有哪些技术可以避免为getter和setter编写大量样板代码?
这里和那里有一些关于getter和setter是否是邪恶的讨论。
因此,我避免样板代码的策略是:尽量避免getter和setter。当需要一些纯数据类时,我将(少数)字段声明为公共字段。但是在这些情况下,我尽量避免给他们任何其他逻辑,我尽量保持这些类
。另外,阅读关于告诉不要问的信息,例如来自马丁·福勒。
我猜你正在寻找这样的东西:
template <typename T>
class Property{
private:
T val;
std::function<void(T& v,const T& newV)> setFN = nullptr;
public:
void setter(decltype(setFN) newSetter){
setFN = newSetter;
}
void set(const T& newVal){
if(!setFN)
val = newVal;
else
setFN(val,newVal);
}
T get(){
return val;
}
};
所以基本上是一个模板类,能够存储一个 setter 函数。如果存储了一个,则调用它,如果没有,则只使用一个operator=
(当然,这需要由 T 定义)。
用法:
int main() {
Property<int> x;
x.set(5);
std::cout << x.get() << std::endl;
x.setter([](int& v, const int& newV){std::cout << "Setter calledn"; v=newV;});
x.set(2);
std::cout << x.get() << std::endl;
return 0;
}
输出:
5
Setter called
2
在线试用
以类似的方式实现 getter 函数应该很容易。
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 访问被拒绝后,c++中的故障保护代码
- 为什么示例代码访问IUnknown中已删除的内存
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 无法访问的代码 在 C++11 中,可能导致这种情况的原因是什么?
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 无法访问的代码如何导致我的程序崩溃?
- 是否可以访问代码中的调用堆栈?
- C++/CLI访问字符串::来自非CLI代码的格式
- Java 本机访问代码错误:"Invalid memory access"
- 访问C 代码中的PWD
- 我们还能使用任何其他方法来访问Android中的C 代码,而不是使用JNI访问C 代码
- 如何将DLL访问代码从C++移植到C#
- 警告级别4中的不可访问代码警告
- 使用.open()成员函数C++的ifstream数组的错误访问代码
- 在 Apache Cordova for Android 中访问C++代码
- 错误的访问代码 1 glDrawElements
- 外部"C"访问代码的函数
- 访问代码中的Makefile变量
- 使用Unicode终止符的QString中的访问代码