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

安徽省招标投标信息网官方网站应用商店aso

安徽省招标投标信息网官方网站,应用商店aso,网站备案授权书模板,政府门户网站建设现状类型擦除(Type Erasure)和模板特化(Template Specialization)是 C 中两个非常强大的泛型编程机制。它们可以分别用于构建灵活的抽象接口和控制模板行为。我们将分别讲解这两个机制的原理、用法以及结合应用示例。 一、类型擦除&am…

类型擦除(Type Erasure)和模板特化(Template Specialization)是 C++ 中两个非常强大的泛型编程机制。它们可以分别用于构建灵活的抽象接口和控制模板行为。我们将分别讲解这两个机制的原理用法以及结合应用示例


一、类型擦除(Type Erasure)

原理概念

类型擦除是一种设计技巧,用于隐藏类型信息而保留其行为,使得用户代码可以操作任意类型的对象,只要它满足某些接口要求。例如:

  • 标准库中的 std::function
  • std::any / std::variant
  • 自定义泛型容器 / 接口桥接器

示例:模拟 std::function 的类型擦除

实现一个 AnyCallable,它可以存储任意可调用对象(函数、lambda、仿函数等)。

#include <iostream>
#include <memory>class AnyCallable {
public:// 构造函数模板,接受任意可调用对象template<typename Callable>AnyCallable(Callable func) : obj_(std::make_unique<Model<Callable>>(std::move(func))) {}// 调用包装的函数void operator()() const {obj_->call();}private:struct Concept {virtual ~Concept() = default;virtual void call() const = 0;};template<typename Callable>struct Model : Concept {Callable func_;Model(Callable f) : func_(std::move(f)) {}void call() const override {func_();}};std::unique_ptr<Concept> obj_;
};int main() {AnyCallable f1 = []() { std::cout << "Hello Lambda\n"; };AnyCallable f2 = []() { std::cout << "Another function\n"; };f1();f2();return 0;
}

重点:

  • Concept 是一个抽象基类(接口)
  • Model<T> 是具体类型实现,模板化实现任意类型
  • 所有类型都被“擦除”成 Concept* 接口操作

二、模板特化(Template Specialization)

模板特化是控制模板行为的工具,可以为特定类型或条件提供特殊实现

分类:

  • 全特化(Full Specialization)
  • 偏特化(Partial Specialization)
  • SFINAE/std::enable_if/constexpr if 条件特化

示例 1:全特化

template<typename T>
struct Printer {void print() { std::cout << "Generic type\n"; }
};template<>
struct Printer<int> {void print() { std::cout << "Int specialization\n"; }
};int main() {Printer<double>().print();  // GenericPrinter<int>().print();     // Int specialization
}

示例 2:偏特化

template<typename T1, typename T2>
struct Pair {};template<typename T>
struct Pair<T, int> {void print() { std::cout << "Second is int\n"; }
};int main() {Pair<double, int>().print();  // Second is int
}

三、二者结合:类型擦除 + 模板特化示例

用一个统一接口 PointContainer 来封装不同类型的点云容器(如 std::vector<Eigen::Vector3d>pcl::PointCloud<pcl::PointXYZ>等),并通过特化获取其大小、访问等。

示例:简化版点容器类型擦除 + 特化访问器

#include <iostream>
#include <vector>
#include <memory>
#include <Eigen/Dense>// 类型擦除接口
class IPointContainer {
public:virtual ~IPointContainer() = default;virtual size_t size() const = 0;virtual Eigen::Vector3d point(size_t i) const = 0;
};// 模板实现(通过特化支持不同容器)
template<typename T>
class PointContainerImpl : public IPointContainer {
public:PointContainerImpl(T data) : data_(std::move(data)) {}size_t size() const override {return traits<T>::size(data_);}Eigen::Vector3d point(size_t i) const override {return traits<T>::point(data_, i);}private:T data_;
};// traits 特化
template<typename T>
struct traits;template<>
struct traits<std::vector<Eigen::Vector3d>> {static size_t size(const std::vector<Eigen::Vector3d>& v) {return v.size();}static Eigen::Vector3d point(const std::vector<Eigen::Vector3d>& v, size_t i) {return v[i];}
};// 使用统一接口
int main() {std::vector<Eigen::Vector3d> pts = {{1, 2, 3},{4, 5, 6}};std::unique_ptr<IPointContainer> container = std::make_unique<PointContainerImpl<std::vector<Eigen::Vector3d>>>(pts);for (size_t i = 0; i < container->size(); ++i) {std::cout << "Point: " << container->point(i).transpose() << "\n";}
}

总结对比:

特性类型擦除模板特化
目的抽象接口,隐藏实现类型为特定类型提供自定义实现
实现机制虚函数 + 模板组合template<> / std::enable_if
灵活性高,运行时处理多种类型高,编译期选择不同实现
成本有运行时开销(虚函数)无运行时开销,编译期展开
使用场景插件式架构、多态容器、API封装数值类型优化、特例算法、高性能分支
http://www.cadmedia.cn/news/3954.html

相关文章:

  • 免费英文建设网站培训心得简短50字
  • 做电子外贸网站合肥网站优化
  • 企业做一个app多少钱西安seo网站关键词优化
  • 诚通凯胜生态建设有限公司网站上海做网站优化
  • 北京网站制作人才精准客源引流平台
  • 长宁区公司网站建设seo资讯推推蛙
  • 如何创建一个网络平台网站设计优化
  • 按城市亭湖建设局网站南宁百度seo建议
  • 给卖假性药的做网站一般要判多久网站建设公司是怎么找客户
  • wordpress自动生成页面插件站内优化
  • 公司官方网站制作软件外包公司排行榜
  • 站群搭建百度指数有三个功能模块
  • 电商网站建设需求分析书专业竞价托管哪家好
  • b2b网址名称泉州百度seo公司
  • 网站视频下载脚本第三方网站流量统计
  • 携程网网站规划建设特点网站推广优化怎么做最好
  • 岱山建设网站黄页88
  • 海口网站开发找千素网重庆seo排名软件
  • 嘉兴网站建设嘉兴baidu百度网盘
  • 成都市成华区建设局官方网站百度旧版本下载
  • 17网一起做网店宁波seo网页怎么优化
  • 什么网站做h5做得好游戏推广赚佣金
  • 怎么建立一个小说网站网站内部优化有哪些内容
  • 资讯类网站建设资质要求凡科建站代理
  • 京山网站设计公司正规排名网站推广公司
  • 承德企业网站建设公司58同城推广
  • wordpress定时功能免费培训seo网站
  • 上海网站建设webmeng网站怎样优化关键词好
  • 做外国独立网站百度手机关键词排名工具
  • 黄山市住房城乡建设厅网站免费域名注册网站