在这种情况下我真的需要使用另一个模板吗

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:

  1. 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 将只是一个右值引用。