当前位置: 首页 >  在线教学 >  【C++】在使用PImpl技术时,template/typename的不常见用法

【C++】在使用PImpl技术时,template/typename的不常见用法

导读:PImpl:Pointer to implementation,常用于隐藏实现细节,构造拥有稳定 ABI 的 C++ 库接口,及减少编译时依赖。.在使用pimpl技术时,pimpl是类静态变量,对其在源文件中的实现需要使用typename关键字.对于模板类的静态成员变量的定义,你

PImpl:Pointer to implementation,常用于隐藏实现细节,构造拥有稳定 ABI 的 C++ 库接口,及减少编译时依赖。

在使用pimpl技术时,pimpl是类静态变量,对其在源文件中的实现需要使用typename关键字

对于模板类的静态成员变量的定义,你需要使用完整的模板类型限定符来指定 std::unique_ptr 的类型。在这个示例中,我们使用 typename MyClass<T>::Impl 来指定 std::unique_ptr 的类型。

// MyClass.h

#include <memory>

template<typename T>
class MyClass {
public:
    void doSomething();

private:
    class Impl;
    static std::unique_ptr<Impl> p_impl;  // 静态 p_impl 变量的声明
};

// MyClass.cpp

template<typename T>
class MyClass<T>::Impl {
public:
    void doSomething() {
        // 实现具体逻辑
        std::cout << "Doing something..." << std::endl;
    }
};

template<typename T>
std::unique_ptr<typename MyClass<T>::Impl> MyClass<T>::p_impl = std::make_unique<typename MyClass<T>::Impl>();  // 静态 p_impl 变量的定义

template<typename T>
void MyClass<T>::doSomething() {
    p_impl->doSomething();
}

如果一个模板类使用p_impl技术,同时内部包含模板函数,那么模板函数的调用需要额外使用template关键字

在最后的代码p_impl->template doSomething<U>();处,使用template关键字告诉编译器我们正在引用一个模板成员函数doSomething<U>()。不使用template关键字会报错

// MyClass.h

#include <memory>

template<typename T>
class MyClass {
public:
    MyClass();
    template<typename U>
    void doSomething();

private:
    class Impl;
    std::unique_ptr<Impl> p_impl;
};

// MyClass.cpp

template<typename T>
class MyClass<T>::Impl {
public:
    template<typename U>
    void doSomething() {
        // 实现具体逻辑
        std::cout << "Doing something with type " << typeid(U).name() << "..." << std::endl;
    }
};

template<typename T>
MyClass<T>::MyClass() : p_impl(std::make_unique<Impl>()) {}

template<typename T>
template<typename U>
void MyClass<T>::doSomething() {
    p_impl->template doSomething<U>();
}
内容
  • 【Oculus Interaction SDK】(一)设置 VR 相机与控制器 & 实现简单的抓取功能
    【Oculus Interact
    2023-12-10
    前言.前段时间 Oculus 的 SDK.频繁更新,很多已有的教程都不再适用于现在的版本了。本系列文章的主要目的是记录现
  • 刀光拖尾功能的改良
    刀光拖尾功能的改良
    2023-12-09
    年末终于有空,刀光拖尾是我很早就想回顾的一个课题,项目中多采用插件实现,很少有机会去研究。.之前也写过一版拖尾,但效果并
  • Unity绘制圆和缓动雷达图
    Unity绘制圆和缓动雷达图
    2023-12-08
    Unity绘制圆和缓动雷达图.之前在做UI模块的时候遇到过需要做雷达图的效果,所以简单复习了一下.关于网格绘制.我们都知
  • UE 油画滤镜
    UE 油画滤镜
    2023-12-07
    前言.非真实感渲染的风格不经相同,其中一种便是油画风格,本文总结了如何实现油画滤镜的方法.Kuwahara Filter
  • UE5 材质 运动的扭曲效果
    UE5 材质 运动的扭曲效果
    2023-12-06
    前言.本篇使用UE5的材质系统实现运动的扭曲效果,并解决他的重复性.纹理变换.总结思路.为uv坐标添加time节点.实现
  • 暗黑破坏神词缀实现思路2.0
    暗黑破坏神词缀实现思路2.0
    2023-12-05
    代码示例.Github地址:暗黑破坏神词缀实现思路-示例代码.序言.暗黑类游戏非常经典,之前玩过很多,也尝试过写过实现的
  • OnionArch - 采用DDD+CQRS+.Net 7.0实现的洋葱架构
    OnionArch - 采用DD
    2023-12-04
    博主最近失业在家,找工作之余,看了一些关于洋葱(整洁)架构的资料和项目,有感而发,自己动手写了个洋葱架构解决方案,起名叫
  • 标题:在Godot中使用Node2D创建自定义的Label
    标题:在Godot中使用Node
    2023-12-04
    在Godot游戏引擎中,我们经常需要在游戏中显示文本信息。通常,我们可以使用Label节点来实现这一点。但是,在某些情况
  • 使用Unity Localization插件进行项目本地化实战详解
    使用Unity Localiza
    2023-12-03
    在使用Unity开发游戏的过程中,本地化是必不可少的。网络上也有很多的本地化工具,本次我介绍的是Unity官方提供的Lo
  • 在MacOS下使用Unity3D开发游戏
    在MacOS下使用Unity3D
    2023-12-03
    第一次发博客,先发一下我的游戏开发环境吧。.去年2月份买了一台MacBookPro2021 M1pro(以下简称mbp)
  • 缓存面试解析:穿透、击穿、雪崩,一致性、分布式锁、Redis过期,海量数据查找
    缓存面试解析:穿透、击穿、雪崩,
    2023-12-03
    为什么使用缓存.在程序内部使用缓存,比如使用map等数据结构作为内部缓存,可以快速获取对象。通过将经常使用的数据存储在缓
  • UE开发使用Rider时缓存干爆C盘的解决方案
    UE开发使用Rider时缓存干爆
    2023-12-03
    我们在使用Rider开发UE时,Ride会为每一个项目创建一个解决方案缓存,如果开几个新项目写测试demo,我们的C盘会
  • 实现草地Shader的物体互动效果
    实现草地Shader的物体互动效
    2023-12-02
    我跟着教程:https://zhuanlan.zhihu.com/p/433385999 用Unity Shader实现
  • 驱动开发:内核LoadLibrary实现DLL注入
    驱动开发:内核LoadLibra
    2023-12-02
    远程线程注入是最常用的一种注入技术,在应用层注入是通过CreateRemoteThread这个函数实现的,该函数通过创建
  • Unity学习笔记--数据持久化Json
    Unity学习笔记--数据持久化
    2023-12-02
    JSON相关.json是国际通用语言,可以跨平台(游戏,软件,网页,不同OS)使用,.json语法较为简单,使用更广泛。
  • C++学习-static
    C++学习-static
    2023-12-02
    全局变量使用:.作用是限定全局变量的作用范围,只能在当前文件使用,类似给它加了个private属性。.其他文件即使使用e
  • 代码的坏味道(二)——为什么建议使用模型来替换枚举?
    代码的坏味道(二)——为什么建议
    2023-12-02
    为什么建议使用对象来替换枚举?.在设计模型时,我们经常会使用枚举来定义类型,比如说,一个员工类 Employee,他有职
  • ET8开发微信小游戏之部署云服务器Nginx代理
    ET8开发微信小游戏之部署云服务
    2023-12-01
    最近用ET8搞微信小游戏测试,部署到云服务器,手机上运行,必须要用https备案过得域名,客户端使用websocket创
  • 智能智能保健设备
    智能智能保健设备
    2023-10-04
    智能保健设备产品介绍.产品概述.我们的智能保健设备结合了最新的智能技术和保健功能,旨在帮助用户监控和**自身的健康状况。
  • 智能智能娱乐设备
    智能智能娱乐设备
    2023-10-04
    产品功能介绍.1. 智能娱乐设备.我们的智能娱乐设备是一款结合了智能技术和娱乐功能的产品。它拥有丰富的娱乐资源,包括音乐
  • ***容量规划与扩展服务
    ***容量规划与扩展服务
    2023-10-02
    ***容量规划与扩展服务.产品功能.我们的服务器容量规划与扩展服务旨在帮助客户有效地规划和扩展其服务器容量,以满足不断增
  • 数据分析和挖掘软件
    数据分析和挖掘软件
    2023-10-01
    数据分析和挖掘软件.产品功能.我们的数据分析和挖掘软件提供了丰富的功能,能够帮助用户快速有效地实现数据分析和挖掘,包括数
  • 智能手机
    智能手机
    2023-10-01
    产品功能介绍:智能手机.智能手机是一款集通讯、娱乐、办公等功能于一体的移动智能设备。首先,智能手机具有强大的通讯功能,支
  • 电子元件连接器
    电子元件连接器
    2023-10-02
    电子元件连接器.产品功能.电子元件连接器是一种用于连接不同电子元件的重要组件。它可以提供可*的电气连接,从而实现各种电子
  • *****与保养服务
    *****与保养服务
    2023-10-02
    *****与保养服务.产品介绍.我们的服务器维护与保养服务是为了帮助企业解决***运行过程中出现的各种问题,确保服务器的
  • 智能智能安防设备
    智能智能安防设备
    2023-10-05
    产品介绍.我们的智能安防设备是一款结合了最新科技和人性化设计的智能家居产品。它不仅拥有传*安防设备的监控功能,还具备智能
  • 智能医疗设备
    智能医疗设备
    2023-10-02
    智能医疗设备产品介绍.智能医疗设备是一款集成了先进技术的高科技产品,旨在提高医疗保健的效率和质量。该设备主要应用于医院、
  • ***性能优化服务
    ***性能优化服务
    2023-10-02
    ***性能优化服务.我们的服务器性能优化服务是针对企业和个人用户的***性能提升及优化解决方案。无论您是在使用自己的服务