我想在以下结构中重构访问器:
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
数据成员的访问者更加有用和直观,主要是从标准/提升用户期望&#34;这种结构代表时间价值&#34;:
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;
}
吸气者现在更有用吗?您是否在新界面中看到任何奇怪或不安全或违反直觉的内容(除了不向后兼容,我不在乎)?
此外,我还有一个疑问,即通过返回get_val()
或V(val)
或V{val}
来实施val
是否更好。就像现在一样,如果V有一个显式构造函数,它就可以工作。你怎么看待这个问题?
答案 0 :(得分:0)
我个人建议您尽量将界面设为描述性,并避免任何方便的转换以引用数据或类似内容。
原因很简单,就是可用性和维护。如果您或其他人使用ValueTime
(重新)访问代码,当您忘记了精确的界面时,您仍然希望了解您的代码而无需重新访问ValueTime
的定义。
来自std
(例如std::vector
)的成员之间存在差异,因为您明确了解他们的定义。