在这种情况下我真的需要使用另一个模板吗
Need I really use another template in this case
template<class Key, class Value>
class ThreadSafeMap
{
std::mutex m_;
std::map<Key, Value> c_;
public:
Value get(Key const& k) {
std::unique_lock<decltype(m_)> lock(m_);
return c_[k]; // Return a copy.
}
template<class Value2>
void set(Key const& k, Value2&& v) {
std::unique_lock<decltype(m_)> lock(m_);
c_[k] = std::forward<Value2>(v);
}
};
Thread safe std::map: Locking the entire map and individual values
刚刚看了上面的link,找到了那段代码。用它来制作线程安全的地图看起来很棒。我了解到在函数 set
中,我们在第二个参数 v
上使用了引用折叠规则。但是我不明白为什么我们需要导入另一个template<class Value2>
,为什么我们不能简单地使用现有模板class Value
?
v
应该声明为 forwarding reference,它只适用于模板。然后我们需要制作 set
本身模板。
(强调我的)
Forwarding references are a special kind of references that preserve the value category of a function argument, making it possible to forward it by means of std::forward. Forwarding references are either:
- function parameter of a function template declared as rvalue reference to cv-unqualified type template parameter of that same function template:
如果我们将 set
声明为非模板为:
template<class Key, class Value>
class ThreadSafeMap
{
...
// non-template member function
void set(Key const& k, Value&& v) {
std::unique_lock<decltype(m_)> lock(m_);
c_[k] = std::forward<Value2>(v);
}
};
v
将只是一个右值引用。
template<class Key, class Value>
class ThreadSafeMap
{
std::mutex m_;
std::map<Key, Value> c_;
public:
Value get(Key const& k) {
std::unique_lock<decltype(m_)> lock(m_);
return c_[k]; // Return a copy.
}
template<class Value2>
void set(Key const& k, Value2&& v) {
std::unique_lock<decltype(m_)> lock(m_);
c_[k] = std::forward<Value2>(v);
}
};
Thread safe std::map: Locking the entire map and individual values
刚刚看了上面的link,找到了那段代码。用它来制作线程安全的地图看起来很棒。我了解到在函数 set
中,我们在第二个参数 v
上使用了引用折叠规则。但是我不明白为什么我们需要导入另一个template<class Value2>
,为什么我们不能简单地使用现有模板class Value
?
v
应该声明为 forwarding reference,它只适用于模板。然后我们需要制作 set
本身模板。
(强调我的)
Forwarding references are a special kind of references that preserve the value category of a function argument, making it possible to forward it by means of std::forward. Forwarding references are either:
- function parameter of a function template declared as rvalue reference to cv-unqualified type template parameter of that same function template:
如果我们将 set
声明为非模板为:
template<class Key, class Value>
class ThreadSafeMap
{
...
// non-template member function
void set(Key const& k, Value&& v) {
std::unique_lock<decltype(m_)> lock(m_);
c_[k] = std::forward<Value2>(v);
}
};
v
将只是一个右值引用。