重构来自/到一个数据成员的读写访问器
Refactoring read write accessors from/to one data member
我想用以下结构重构访问器:
template<class T>
class ValueTime {
public:
// accessors for val:
const T& get_val() const { return val; }
template<class V> void set_val(const V& v) { val = v; }
// other accessors for tp
private:
T val;
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
};
我想使val
数据成员的访问器更有用和直观,主要是从"标准/提高用户期望"的角度来看,这种结构表示"时间值":
-
template<class V = T> V get_val() { return V(val); }
-
T& operator*() & { return val; }
-
const T& operator*() const & { return val; }
现在我可以这样使用访问器了(见注释):
int main() {
ValueTime<double> vt;
// get_val() no longer returns const ref and also
// allows explicit cast to other types
std::chrono::minutes period{vt.get_val<int>()}; // I had to use the more pedantic static_cast<int> with the original version
// let's use operator*() for getting a ref.
// I think that for a structure like a ValueTime structure,
// it's clear that we get a ref to the stored "value"
// and not to the stored "time_point"
auto val = *vt; // reference now;
val = 42;
}
getter现在更有用了吗?你在新界面中看到了什么奇怪、不安全或违反直觉的地方吗(除了不向后兼容,我不在乎)?
此外,我仍然有一个疑问,如果通过返回V(val)
或V{val}
或仅仅val
来实现get_val()
更好。就像现在一样,如果V有显式构造函数,它就会工作。你对这个问题怎么看?
我个人建议您尽可能使接口具有描述性,并避免任何方便的转换为引用数据或类似内容。原因很简单,就是可用性和维护。如果您或其他人使用ValueTime
(重新)访问代码,当您不记得确切的接口时,您仍然希望在不重新访问ValueTime
定义的情况下理解您的代码。
成员与std
(如std::vector
)的不同之处在于,您已经记住了它们的定义。
相关文章:
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- 大家好,当一个类有一个向量作为它的数据成员时,为什么它的大小总是24?
- 返回带有另一个类的数据成员的构造函数?遇到转换错误?
- 在结构向量中搜索一个数据成员,然后打印匹配的所有数据成员
- 虚拟继承的性能开销(如果只有一个基具有数据成员)
- 从一个类的数据成员的值从另一个类更改
- 如何在STD :: MAP中找到具有至少一个数据成员等于密钥的结构的元素
- 从另一个命名空间访问标准命名空间数据成员
- 是否有必要重载具有另一个类 B 的数据成员的类 A 的赋值运算符和复制构造函数?
- 静态const数据成员在另一个文件中定义
- 只有当声明一个对象时,内存空间才会分配给类的数据成员,那么为什么 Sizeof(class_name) 给我结果
- 如何在C 中的另一个对象的同一数据成员中输入另一个字符串
- 非静态数据成员和一个定义规则
- 如何创建一个将队列作为数据成员的类,该成员在 c++ 中存储另一个类的实例
- 参考数据会在const函数中更改另一个数据成员
- 在C++中,"static initialization fiasco"是否仅影响对另一个模块中定义的对象的数据成员的引用?
- 为具有一个数字数据成员的类定义所有比较运算符的方便方法
- 在重载运算符中访问另一个类的数据成员
- 并集:从并集的一个数据成员中读取数据,然后写入另一个