当前位置: 首页 > news >正文

国外营销企业网站什么叫高端网站定制

国外营销企业网站,什么叫高端网站定制,开发定制软件app需要多少钱,读书分享会ppt模板免费下载Effective C 条款45:运用成员函数模板接受所有兼容类型核心思想:使用成员函数模板(member function templates)生成可接受兼容类型的函数,特别是泛型拷贝构造函数和赋值操作符,同时避免抑制编译器生成的默认…

Effective C++ 条款45:运用成员函数模板接受所有兼容类型


核心思想使用成员函数模板(member function templates)生成可接受兼容类型的函数,特别是泛型拷贝构造函数和赋值操作符,同时避免抑制编译器生成的默认特殊成员函数。

⚠️ 1. 智能指针的类型转换问题

问题根源

  • 希望智能指针能模拟内置指针的隐式转换(如派生类指针到基类指针)
  • 模板实例化后不同模板参数生成的是不同类,无法直接转换
  • 需要为每种可能的兼容类型单独编写构造函数,不现实

错误示例

template<typename T>
class SmartPtr {
public:explicit SmartPtr(T* realPtr); // 原始指针构造函数// 希望支持以下转换,但无法实现:// SmartPtr<Base> = SmartPtr<Derived>// SmartPtr<const T> = SmartPtr<T>
};

🚨 2. 成员函数模板解决方案

解决方案

  • 声明成员函数模板(泛型拷贝构造函数)
  • 使用类型约束确保安全转换

优化实现

template<typename T>
class SmartPtr {
public:template<typename U>SmartPtr(const SmartPtr<U>& other)  // 泛型拷贝构造: heldPtr(other.get()) { }     // 使用get()获取原始指针T* get() const { return heldPtr; } // 获取原始指针private:T* heldPtr; // 持有原始指针
};

类型安全约束

  • 添加编译期类型检查,确保U可隐式转换为T
template<typename T>
class SmartPtr {
public:template<typename U, typename = std::enable_if_t<std::is_convertible_v<U*, T*>>>SmartPtr(const SmartPtr<U>& other): heldPtr(other.get()) { }// ...
};

⚖️ 3. 赋值操作与兼容性处理

问题场景

  • 需要支持不同类型的智能指针赋值
  • 同时要避免编译器自动生成默认拷贝操作

解决方案

  • 为赋值操作定义成员模板函数
  • 显式声明普通拷贝操作以避免被模板隐藏

完整实现

template<typename T>
class SmartPtr {
public:// 泛型拷贝构造template<typename U, typename = std::enable_if_t<std::is_convertible_v<U*, T*>>>SmartPtr(const SmartPtr<U>& other);// 显式声明普通拷贝构造和赋值(防止被模板隐藏)SmartPtr(const SmartPtr&); SmartPtr& operator=(const SmartPtr&);// 泛型赋值操作符template<typename U, typename = std::enable_if_t<std::is_convertible_v<U*, T*>>>SmartPtr& operator=(const SmartPtr<U>& other);// ... 其他成员 ...
};

注意事项

  • 成员函数模板不改变语言规则:拷贝构造函数不会阻止编译器生成默认拷贝构造函数
  • 若需要完全控制,可显式定义或使用=default/=delete

💡 关键设计原则

  1. 使用成员函数模板实现泛型构造
    成员函数模板可生成接受任意兼容类型的构造函数和赋值函数

    template<typename T>
    class SharedPtr {
    public:template<typename Y>explicit SharedPtr(Y* p);  // 从任意类型指针构造template<typename Y>SharedPtr(const SharedPtr<Y>& r); // 兼容类型拷贝构造
    };
    
  2. 添加类型转换约束
    使用std::enable_if和类型特征确保安全转换

    template<typename T>
    class SmartPtr {template<typename U, typename = std::enable_if_t<std::is_convertible_v<U*, T*>>>SmartPtr(const SmartPtr<U>&);
    };
    
  3. 显式声明默认函数
    避免成员模板隐藏编译器生成的默认函数

    template<typename T>
    class SmartPtr {
    public:// 显式声明拷贝操作SmartPtr(const SmartPtr&); SmartPtr& operator=(const SmartPtr&);// 成员模板构造函数...
    };
    

实战:跨类型智能指针赋值

class Base { /*...*/ };
class Derived : public Base { /*...*/ };SmartPtr<Base> pBase(new Base);
SmartPtr<Derived> pDerived(new Derived);// 使用成员模板实现兼容类型赋值
pBase = pDerived;  // 正确:通过泛型赋值操作符// 错误示例:类型不兼容
SmartPtr<int> pInt(new int);
// pBase = pInt; // 编译错误:类型约束阻止转换

类型特征约束进阶

// 使用更精确的约束:派生关系
template<typename T>
class SmartPtr {template<typename U, typename = std::enable_if_t<std::is_base_of_v<T, U> || std::is_convertible_v<U*, T*>>>SmartPtr(const SmartPtr<U>&);
};

总结成员函数模板允许类模板生成接受任意兼容类型的函数,是实现泛型拷贝构造和赋值操作的关键技术。通过添加编译期类型约束(如std::enable_if和类型特征)确保转换安全,同时显式声明默认拷贝操作以避免被模板隐藏。这一技术广泛用于智能指针、迭代器等需要类型灵活性的场景,是编写高级模板代码的必备技能。

http://www.dtcms.com/a/499538.html

相关文章:

  • Flutter---生命周期
  • 百度网址大全网站互联网家装
  • 专业的东莞网站排名WordPress多站点开启多语言
  • 微信端网站开发流程做网站什么配置够用
  • c# 泛型的详细介绍
  • OceanBase的SQL和执行计划监控视图
  • 网站原创内容优化wordpress 网站内跳转
  • 龙口市规划建设局网站南京app开发公司排名
  • 解决 Hugging Face 国内下载慢的问题:用 ModelScope 替代加速模型获取
  • 从基础到深入:自然语言处理核心技术全梳理(有 ML/DL 基础)
  • 合肥建设公司网站wordpress 个人电脑
  • 做网站需要哪些方面的支出新媒体运营需要学什么
  • 云手机群控是什么意思
  • 【ecfw】ecfw构建基础
  • 常州二建建设有限公司官方网站聊城做wap网站哪儿好
  • php做网站需要html国外设计公司名字
  • CUDA nvjpeg库编码jpeg图像
  • AI 工作流实战 - 调用豆包api实现批量生图
  • 如何编写您的第一个 Linux 设备驱动程序(一)
  • 做更好的自己 网站客户又找不到你
  • Spring MVC 封装全局统一异常处理
  • 海尔建设网站的内容wordpress设置教程
  • Flutter---EQ均衡器
  • 响应式食品企业网站网站的外链是什么
  • 【Protobuf】proto3语法详解1
  • 网站备案要做家居网站设计
  • VS2022+DirectX9之创建DirectX9设备
  • unordered_map和unordered_set的封装与简单测试
  • (Kotlin协程十六)try/catch 可以捕获子协程的异常吗?为什么?
  • 网站移动端怎么做的做外国网站怎么买空间