Lær*_*rne 1 c++ templates condition-variable c++11 type-deduction
为什么在下面的代码段,并在模板类型不能自动从最后一个参数就像在做推断,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();
}
Run Code Online (Sandbox Code Playgroud)
当我尝试构建类似的行时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.感谢您的任何帮助 !
类型的模板参数不能推断,期间.这是因为类型特化可以提供完全不同的成员集,因此在您知道类型的模板参数之前,您甚至不知道哪些构造函数可用.
这就是标准库具有辅助函数的原因,例如std::make_pair.当构建或引用一个std::pair你必须指定类型参数(std::pair<int, double>(1, 2.0)),但在大多数情况下,他们可以在调用函数时(推断std::make_pair(1, 2.0)).(注意,这std::condition_variable::wait是一个函数,而不是一个类型.)
如果为您的lock_monitor_guard类型实现移动构造函数,那么您可以创建一个类似于精神的辅助函数std::make_pair,然后使用复制初始化auto来提供演绎.(请注意,您还必须调整析构函数,以解释this移动构造函数使其内容"被盗" 的可能性.)
template <typename Predicate>
lock_monitor_guard<Predicate> create_lock_monitor_guard(
std::mutex & mutex,
std::condition_variable & monitor,
Predicate && predicate)
{
return lock_monitor_guard<Predicate>(mutex, monitor, std::forward<Predicate>(predicate));
}
auto guard = create_lock_monitor_guard(
jobs_mutex,
jobs_monitor,
[] { return true; });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |