Herb Sutters 如何监控课堂?

And*_*ndy 5 c++ c++11

我试图了解 Herb Sutter 在 C++ 和 Beyond 2012 上展示的监视器类:

template<typename T>
class monitor {
private:
    mutable T t;
    mutable std::mutex m;

public:
    monitor(T t_ = T{}) : t{ t_ } {} 
    template<typename F>
    auto operator()(F f) const -> decltype(f(t))
    {
        std::lock_guard<std::mutex> _{ m }; return f(t);
    }
}; 
Run Code Online (Sandbox Code Playgroud)

我设法创建了一个以更老式和更简单(至少对我而言)的方式做同样事情的类:

template<typename T>
class MyMonitor {
public:
    MyMonitor() { t = T(); }

    template<typename F>
    auto callFunc(F f) {
        std::lock_guard<std::mutex> lock(m);
        return f(t);
    }

private:
    T          t;
    std::mutex m;
};  
Run Code Online (Sandbox Code Playgroud)

Herb Sutters 的代码在哪些方面比我的好?

Jar*_*d42 3

Herb Sutters 的代码在哪些方面比我的更好?

  • 你的T应该是默认可构造和可分配的。
  • 在 Herb Sutters 代码中,T应该是可复制构造的。

  • Herb Sutters 代码允许初始化成员。

  • operator ()不处理参考。

  • @idclev463035818:`mutable` 和 `const` 与非 `const` 的比较... (2认同)
  • *“它应该是常量”*。不确定,虽然 `mutex` 确实不会改变对象的 const 语义,但在我看来,修改 `T` 更具争议性。 (2认同)