鱼C论坛

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

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

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

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

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

x
有时候,(别问,问就是写variant的时候),会为它添加一个模板化的带参构造函数:
struct Test{
    template <typename T>
    Test (T&& t){
        //....
    }
    Test (const T&){
        //....
    }
}
这个时候,如果再为其添加复制构造函数,会发现,根本不会调用构造函数,而是进入以const Test&实例化的带参构造函数。
要解决这个问题,可以使用C++的SFINAE特性,
为带参构造函数的模板参数添加一个不使用的有默认类型的参数,且在T为Test时其会出现编译错误。

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


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

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

所以,可以把写成这样
struct Test{
    template <typename T,typename= enable_if_t<!is_same_v<decay_t<T>, Test>>>
    Test (T&& t){
        //....
    }
    Test (const T&){
        //....
    }

这样带参构造函数的模板类型为Test的时候,将无法实例化,从而不会覆盖复制构造函数和移动构造函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-1-21 12:39:29 | 显示全部楼层
学习笔记的分类怎么添加不上去- -
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 08:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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