[英]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_t
比std::decay_t
更適合該意圖。您可以從C ++ 20開始使用它。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.