繁体   English   中英

具有完美转发功能的模板转换构造函数

[英]Template converting constructor with perfect forwarding

是否可以用具有完美转发功能的单个模板构造函数替换此程序中的两个构造函数?

#include <unordered_map>
#include <unordered_set>
#include <string>

using Mymap = std::unordered_map<std::string, std::unordered_set<std::string>>;

class A {
    Mymap n_;
public:
    A(Mymap&& n) 
        : n_{std::move(n)} 
    {}

    A(Mymap& n) 
        : n_{n} 
    {}

    // doesn't compile
    //template <typename T>
    //A(T<Mymap::value_type>&& n)
    //    : n_{std::forward(n)}
    //{}
};

int main() {
    A a1{{{"C", {"A", "B"}}}};

    Mymap m{{{"C", {"A", "B"}}}};
    A a2{m};
}

如果Mymap移动价格便宜,则通常首选按值传递:

A(Mymap n) : n_(std::move(n)) {}

否则,您必须依靠丑陋的解决方案:

template <class T, class = std::enable_if_t<std::is_same_v<Mymap, std::decay_t<T>>>>
A(T&& n) : n_(std::forward<T>(n)) {}

(可以说, std::remove_cvref_tstd::decay_t更适合该意图。您可以从C ++ 20开始使用它。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM