我一直在考虑创建一个同步器帮助器模板类,它基于 Herb Sutter 在本次演讲中关于包装器类的想法这在 msvc 中不起作用(除非我们删除大括号初始化)但是当大括号初始化被删除时就可以了.
在 clang/gcc (ubuntu 12.10, gcc4.7.2, clang (3.2) self built with libc++) 中,私有访问修饰符似乎必须出现在公众面前:这似乎有点奇怪。
gcc 中的错误是
error: ‘t_’ was not declared in this scope
铿锵是
error: use of undeclared identifier 't_'
auto operator()(F f) const ->decltype(f(t_))
这可能是我不知道的模板/declytpe 问题,并且想知道是否有人可以帮助解决这个问题。(全部使用相关的 c++11 标志编译)
template <class T>
class Synchronised {
public:
Synchronised(T t = T{}) : t_{t} {}
template <typename F>
auto operator()(F f) const -> decltype(f(t_)) {
std::lock_guard<std::mutex> lock{mutex_};
return f(t_);
}
private: // place this before public: and this object compiles
mutable T t_;
mutable std::mutex mutex_;
};
编辑:添加约翰内斯的想法和全班,以防有人想要剪切和粘贴。
#include <future>
#include <iostream>
#include <thread>
#include <vector>
template <class T> T &self(T &t) { return t; }
template<typename T> struct Dependent { };
template<typename T>
class Synchronised : Dependent<T>{
public:
explicit Synchronised(T t = T()) : t_(t) {}
template<typename Functor>
auto operator()(Functor functor) const ->decltype(functor(self(*this).t_)) {
//auto operator()(Functor functor) const ->decltype(functor(this->t_)) {
std::lock_guard<std::mutex> lock(mutex_);
return functor(t_);
}
private:
mutable T t_;
mutable std::mutex mutex_;
};
int main() {
Synchronised<std::string> sync_string("Start\n");
std::vector<std::future<void>> futures;
}