鱼C论坛

 找回密码
 立即注册
查看: 1730|回复: 1

[技术交流] 如何为一个添加了模板带参构造函数的的类设定复制构造函数。

[复制链接]
发表于 2020-1-21 12:37:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有时候,(别问,问就是写variant的时候),会为它添加一个模板化的带参构造函数:
  1. struct Test{
  2.     template <typename T>
  3.     Test (T&& t){
  4.         //....
  5.     }
  6.     Test (const T&){
  7.         //....
  8.     }
  9. }
复制代码

这个时候,如果再为其添加复制构造函数,会发现,根本不会调用构造函数,而是进入以const Test&实例化的带参构造函数。
要解决这个问题,可以使用C++的SFINAE特性,
为带参构造函数的模板参数添加一个不使用的有默认类型的参数,且在T为Test时其会出现编译错误。

先解释一下type_trait里的相关模板:
  1.         is_same_v<typename T1,typename T2>
  2.         //等同于
  3.         is_same<typename T1,typename T2>::value
  4.         //两类型是否相同


  5.         decay_t<typename T>
  6.         //等同于
  7.         decay<typename T>::type
  8.         //去掉T的所有const,volatile以及引用修辞

  9.         enable_if_t<bool b,typename T=void>
  10.         //等同于
  11.         enable_if<bool b,typename T>
  12.         //在bool为false时什么也不是,导致编译此段代码无法通过编译,实现SFINE
复制代码


所以,可以把写成这样
  1. struct Test{
  2.     template <typename T,typename= enable_if_t<!is_same_v<decay_t<T>, Test>>>
  3.     Test (T&& t){
  4.         //....
  5.     }
  6.     Test (const T&){
  7.         //....
  8.     }
复制代码


这样带参构造函数的模板类型为Test的时候,将无法实例化,从而不会覆盖复制构造函数和移动构造函数
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-1-21 12:39:29 | 显示全部楼层
学习笔记的分类怎么添加不上去- -
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 20:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表