从一个数据成员重构读写访问器

时间:2015-10-21 10:46:58

标签: c++ c++11 boost std

我想在以下结构中重构访问器:

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;:

  1. template<class V = T> V get_val() { return V(val); }
  2. T& operator*() & { return val; }
  3. const T& operator*() const & { return val; }
  4. 现在我可以这样使用访问器(参见注释):

    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有一个显式构造函数,它就可以工作。你怎么看待这个问题?

1 个答案:

答案 0 :(得分:0)

我个人建议您尽量将界面设为描述性,并避免任何方便的转换以引用数据或类似内容。 原因很简单,就是可用性和维护。如果您或其他人使用ValueTime(重新)访问代码,当您忘记了精确的界面时,您仍然希望了解您的代码而无需重新访问ValueTime的定义。

来自std(例如std::vector)的成员之间存在差异,因为您明确了解他们的定义。