【发布时间】:2014-12-30 19:13:33
【问题描述】:
为什么在下面的代码中,不能像std::condition_variable::wait 那样从最后一个参数自动推断出模板类型?
template< typename Predicate >
//requires Truth< Predicate >
class lock_monitor_guard
{
public:
lock_monitor_guard( std::mutex& mutex, std::condition_variable& monitor, Predicate predicate );
~lock_monitor_guard();
private:
std::unique_lock<std::mutex> lock;
std::condition_variable& monitor;
};
template< typename Predicate >
//requires Truth< Predicate >
lock_monitor_guard<Predicate>::lock_monitor_guard( std::mutex& mutex, std::condition_variable& monitor, Predicate predicate )
: lock( mutex ), monitor( monitor )
{
monitor.wait<Predicate>( lock, predicate );
}
template< typename Predicate >
//requires Truth< Predicate >
lock_monitor_guard<Predicate>::~lock_monitor_guard()
{
lock.unlock();
monitor.notify_one();
}
当我尝试构建像lock_monitor_guard guard( jobs_mutex, jobs_monitor, ([]()->bool{return true;}) ); 这样的行时,我收到一条错误消息:use of class template 'lock_monitor_guard' requires template arguments。但为什么 ?以及为什么它可以与 STL std::condition_variable::wait 一起使用。感谢您的帮助!
【问题讨论】:
-
你必须给 lock_monitor_guard 的模板类型。
-
是的,但是为什么呢?我不想猜测 lambda 的可怕类型!为什么
std::condition_variable::wait不同? -
您可以移动
template< typename Predicate >使其成为构造函数声明的一部分,然后它将起作用。整个lock_monitor_guard类不需要使用Predicate的类型进行参数化 -
非常真实的 piotr。这是最好的解决方法。
标签: c++ templates c++11 condition-variable type-deduction