监视 c<T>++11 和 c++03 中的类实现?
Monitor<T> class implementation in c++11 and c++03?
Herb Sutter在" c++ and Beyond 2012: Herb Sutter - c++ Concurrency"中描述了模板Monitor类的实现:
template<class T> class monitor {
private:
mutable T t;
mutable std::mutex m;
public:
monitor( T t_ ) : t( t_ ) { }
template<typename F>
auto operator()( F f ) const -> decltype(f(t))
{ std::lock_guard<mutex> hold{m}; return f(t); }
};
我正在尝试包装我现有的类Logger:
Logger logger;
monitor< Logger > synchronizedLogger( logger ) ;
我有两个问题。为什么这个代码不编译在Visual Studio 2012与c++11?编译器说" 'Debug':不是'monitor'的成员",其中Debug是Logger类的一个方法。
如何使用Boost库与c++ 03编译器实现相同的监视模板类
您可能正在尝试执行类似monitor< Logger >::Debug(...)
调用的操作。这行不通。
您的监视器可以调用函数试一试:
monitor< Logger > logger;
logger(boost::bind(&Logger::Debug, _1, "blah"));
PS: 我没有使用c++ 11的lambdas,为了不出错,我提供了boost::bind version
edit: Dave好心提供了那个版本
logger([](Logger& l){ l.Debug("blah"); });
感谢大家的回答和评论。这是我实现的monitor
#include <boost/bind.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/locks.hpp>
#include <boost/utility/result_of.hpp>
template<class T> class monitor
{
private:
mutable T& t;
mutable boost::mutex m;
public:
monitor( T& t_ ) : t( t_ )
{
}
template< typename F >
typename boost::result_of< F() >::type operator()( F f ) const
{
boost::lock_guard< boost::mutex > hold( m );
return f( t );
}
};
谈到这个解决方案的正确性(锁的粗粒度等等),我正在考虑使用这个类作为单元测试中我的ILogger接口的Google Mock实现的包装器。Google mock文档指出它在windows上不是线程安全的。
ILogger * mockedLogger = new MockedLogger();
monitor< ILogger > synchronizedLogger( *mockedLogger ) ;
synchronizedLogger( boost::bind( &ILogger::Debug, _1, "blah" ) );
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 是否可以在 C++03 中实现类似"覆盖"的功能
- 如何在 C++03 中实现线程安全的局部静态变量
- 我将如何在C++03中便携地实现对齐堆栈存储
- 监视 c<T>++11 和 c++03 中的类实现?
- 如何在 C++03 中实现通用回调机制而不提升