std::piecewist_construct

网友投稿 556 2022-11-07

std::piecewist_construct

std::piecewist_construct

針對std::map的特殊情況

map類型的emplace處理比較特殊,因爲和其他的容器不同,map的emplace函數把它接收到的所有參數都轉發給了pair的構造函數。對於一個pair來說,它既需要構造它的key又需要構造它的value。如果我們按照普通的語法使用變參模板,我們無法區分哪些參數用來構造key,哪些用來構造value。

std::map> scp;

scp.emplace("hello", 1, 2);//無法區分那個參數用來構造key,哪些參數用來構造value

所以需要一種方式既可以接受異構變長參數,又可以區分key和value,解決方式是使用c++11中提供的turple。

pair> scp(make_tuple("hello"), make_tuple(1,2));

然後這種方式是有問題的,因爲這裏有歧義,第一個tuple會被當做key,第二個tuple會被當成value,最終的結果是類型不匹配而導致對象創建失敗,爲了解決這個問題,c++11設計了piecewise_construct_t這個類型用於解決這種歧義,它是一個空類,存在的唯一目的就是解決這種歧義,全局變量std::piecewist_construct就是該類型的一個變量。所以最終的解決方式是:

pair> scp(piecewise_construct, make_tuple("hello"), make_tuple(1,2));

因爲map的emplace把參數原樣轉發給pair的構造,所以你需要使用同樣的語法來完成emplace的調用,當然你可以使用forward_as_tuple替代make_tuple,該函數會幫你構造一個tupl並轉發給pair構造。

map> scp;scp.emplace(piecewise_construct, forward_as_tuple("hello"), forward_as_tuple(1, 2));

所以对于 map 来说你虽然避免了临时变量的构造,但是你却需要构建两个 tuple

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详解SpringMVC HandlerInterceptor拦截器的使用与参数
下一篇:Getting started
相关文章

 发表评论

暂时没有评论,来抢沙发吧~