我正在尝试理解Herb Sutter在C++ and Beyond 2012上介绍的monitor类:
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);
}
};
我已经成功创建了一个类,用更加老式和简单的方法(至少对我来说)完成了相同的事情:
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;
};
赫伯·萨特的代码与我的代码相比,有哪些方面更好?
operator()
的返回值是由f()
返回的类型,这意味着程序员对返回类型的潜在混淆较少。指向Herb。能够正确处理返回引用的函数对象。指向Herb。使用名为“_”的变量会降低可读性。指向你。 - Peterauto
函数是在C++14中添加的(因此它们并不过时),并遵循auto
永远不是引用的常规规则。 - molbdnilooperator()
将返回值。您可以使用decltype(auto)
作为返回值,以获得与Herbs代码相同的行为,而无需使用尾随返回类型。 - super