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

岳池住房和城乡建设厅网站吉林网络公司

岳池住房和城乡建设厅网站,吉林网络公司,网站后台加什么后缀,湖北省住房建设厅网站目录 1. 特征技术概述(Traits) 1.1 特征技术的目的 1.2 特征技术实现方式 1.3 特征技术常见用例 2. 应用举例 3. 创建自己的特征类 3. C 特征对模板逾编程的贡献 3.1 函数模板逾编程 3.2 类模板逾编程 1. 特征技术概述(Traits) C 特征技术是一种强大的机…目录 1.   特征技术概述(Traits) 1.1  特征技术的目的 1.2  特征技术实现方式 1.3  特征技术常见用例 2.   应用举例 3.   创建自己的特征类 3.   C 特征对模板逾编程的贡献 3.1  函数模板逾编程 3.2  类模板逾编程 1.   特征技术概述(Traits) C 特征技术是一种强大的机制它允许你在编译时获取类型的信息。它使你能够编写能够适应不同类型的泛型代码而无需运行时开销。 您可以将特征视为具有多种结果的一个类型函数或一组类型函数。标准库提供了allocator_traitschar_traitsiterator_traitsregex_traitspointer_traits。此外它还提供了 time_traits和 type_traits。 关键概念为: 类型特征(Type Traits)——提供关于类型的属性。 策略(Policy)——将接口定义为对其他类的服务的类或类模板。 模板逾编程(Template Metaprogramming)——使用模板在编译时执行计算(以避免运行时计算提升运行时性能)。 1.1  特征技术的目的 以下是关键方面的细分 (1) 类型自省 特征技术提供了一种(编译时)查询类型属性的方法例如某个类型是整数、指针还是类。 (2) 编译时自定义 基于从特征获取的信息您可以在编译时自定义代码的行为。这允许针对不同类型的代码路径进行优化。 (3) 泛型编程 特征对于编写可处理多种类型的泛型算法和数据结构至关重要。 (4)  扩展功能 特征技术可以通过提供类型的信息来扩展和调整现有代码。 1.2  特征技术实现方式 (1) 模板类 特征通常以模板类的形式实现。它们将类型作为模板参数。 (2) 静态成员 特征类通常包含静态成员常量或成员类型用于提供有关类型参数的信息。 (3) 特化 您可以针对特定类型特化特征类以提供不同的行为或信息。 (4) 编译时估算 特征在编译时进行求值因此没有运行时开销。 1.3  特征技术常见用例 (1)  类型检查 诸如 std::is_integralstd::is_pointer 和 std::is_class 之类的特征允许您检查类型的属性。 (2) 类型转换 诸如 std::remove_conststd::add_pointer 和 std::remove_reference 之类的特征允许您修改类型。 (3)  算法优化 通过使用特征您可以编写能够针对特定类型使用优化的泛型实现的算法即针对特定类型的模板特化。 (4)  库开发 特征在 C 标准库中被广泛使用以提供泛型功能。 2.   应用举例 不同的代码片段结构基本相同但在细节上存在差异这种情况并不少见。理想情况下我们能够重用这些结构并剔除这些差异。在 C 语言中这可以通过使用函数指针来实现例如 C 标准库中的 qsort 函数或者在 C 中使用虚函数。遗憾的是这与编译时已知的运行时情况不同并且会产生运行时开销。 C 引入了泛型编程使用模板消除了运行时绑定的需求但乍一看这仍然像是一种妥协毕竟相同的算法并非适用于所有数据结构。对链表进行排序与​​对数组进行排序不同。排序数据的搜索速度比未排序数据快得多。 C 特征是模板编程的一个特例通常只关注特定类型的特性例如静态属性和静态函数。它是 C 模板编程最基本的构建块之一。   C 和 C 程序员都应该熟悉 limits.h 和 float.h它们用于确定整数和浮点类型的各种属性。 大多数 C 程序员都熟悉 std::numeric_limits 乍一看它只是提供了相同的服务只是实现方式不同。通过仔细研究numeric_limits我们发现了 trait 的第一个优点一致的接口。 使用 float.h 和 limits.h 时你必须记住类型前缀和特征例如 DBL_MAX 包含 double 数据类型的“最大值”特征。通过使用像numeric_limits这样的特征类类型会成为名称的一部分因此 double 的最大值将变为numeric_limitsdouble::max() 更重要的是你不需要知道需要使用哪种类型。例如以这个简单的模板函数(改编自 [ Veldhuizen ])为例它返回数组中的最大值 template class T T findMax(const T const* data, const size_t const numItems) { // Obtain the minimum value for type T T largest std::numeric_limits T ::min(); for (unsigned int i 0; i numItems; i) if (data[i] largest) largest data[i]; return largest; } 注意numeric_limits的用法。正如您所见与C风格的limits.h习语一样您必须知道类型而使用C 的traits习语只有编译器需要知道类型。不仅如此numeric_limits与大多数traits一样只需通过创建模板的特化版本即可扩展为包含您自己的自定义类型(例如定点或任意精度算术类)。 我们不讨论numeric_limits它只是一个trait实际应用的示例我们介绍如何创建您自己的traits类。 3.   创建自己的特征类 C 特征可用于统一不同类型的低级函数接口从而简化高级模板编程。 例如如果我们想为不同的数值类型(包括 int32_tint64_tfloat 和 double)创建函数例如 greater_than_half_maximum并使用该类型的最大值那么如果不使用 特征技术就很难充分利用模板编程的优势。 template typename T bool greater_than_half_maximum(T value) { return false; } template bool greater_than_half_maximumint32_t(int32_t value) { // 2^31 - 1 if (value 2147483647 / 2) { return true; } else { return false; } } template bool greater_than_half_maximumint64_t(int64_t value) { // 2^63 - 1 if (value 9223372036854775807 / 2) { return true; } else { return false; } } template bool greater_than_half_maximumfloat(float value) { // FLT_MAX defined in cfloat if (value FLT_MAX / 2) { return true; } else { return false; } } template bool greater_than_half_maximumdouble(double value) { // DBL_MAX defined in cfloat if (value DBL_MAX / 2) { return true; } else { return false; } } // Even more specializations for different types. // ... 从上面的例子我们可以看出即使我们想使用模板编程而不使用特征不同类型的特化实现也是不可避免的。 std::numeric_limits 是 C 标准库中的一个类型特征它定义了不同内置类型的最大值。通过使用 std::numeric_limitsT::max()我们无需针对特定用例为不同类型创建特化。 #include limits template typename T bool greater_than_half_maximum(T value) { if (value std::numeric_limitsT::max() / 2) { return true; } else { return false; } } 对于自定义数值类型例如 NVIDIA __half我们可以为 std::numeric_limits 创建特化而不是为 greater_than_half_maximum 创建特化。 namespace std { template class numeric_limits__half { public: constexpr static __half max() { constexpr uint16_t const half_max_bits{ 0x7BFF }; __half const half_max{ *reinterpret_cast__half const*(half_max_bits) }; return half_max; }; }; } // namespace std 当然有人可能会说对于不同的类型我们必须创建不同的类型特征这同样需要大量的工作。然而由于低级类型特征通常比高级特化更具可复用性因此相比于高级模板特化在创建低级类型特征上投入精力更有价值。此外由于高级模板特化通常比类型特征需要更多行实现因此创建低级类型特征所需的工作量比高级模板特化要少。 3.   C 特征对模板逾编程的贡献 C 类型特征对于模板逾编程至关重要。我们将了解它如何用于函数模板逾编程和类模板逾编程。 3.1  函数模板逾编程 当类型特征与 std::enable_if 一起使用时我们可以针对不同类型特化函数实现细节正如我之前的博客文章“使用 Enable If 进行 C 模板特化”中所述。 3.2  类模板逾编程 当类型特征与 std::conditional_t 一起使用时我们可以针对具有不同类型的成员变量且无法简单模板化的类特化其实现细节。 例如C random 库有两个用于生成均匀分布随机数的函数包括用于生成整数值的std::uniform_int_distribution和用于生成实数值的 std::uniform_real_distribution。 以下实现使用类型特征 std::is_integralT::value 统一了这两个随机数生成函数 std::uniform_int_distribution 和 std::uniform_real_distribution。 #include iostream #include iterator #include random #include vector template typename T class UniformDist { public: UniformDist(T a, T b) : m_min{ a }, m_max{ b }, m_uniform_dist{ a, b } {} T operator()(std::mt19937 random_engine) { return m_uniform_dist(random_engine); } private: T const m_min; T const m_max; using dist_t std::conditional_tstd::is_integralT::value, std::uniform_int_distributionT, std::uniform_real_distributionT; dist_t m_uniform_dist; }; template typename T std::vectorT create_random_vector(size_t n, T a, T b, std::mt19937 random_engine) { UniformDistT uniform_dist{ a, b }; std::vectorT vec(n, 0.0); for (size_t i{ 0 }; i n; i) { vec[i] uniform_dist(random_engine); } return vec; } int main() { size_t const n{ 8 }; unsigned int const seed{ 0U }; std::mt19937 random_engine{ seed }; std::vectordouble const random_vector_double{ create_random_vector(n, -16.0, 16.0, random_engine) }; std::cout Random Vector of Doubles: std::endl; std::copy(random_vector_double.begin(), random_vector_double.end(), std::ostream_iteratordouble(std::cout, )); std::cout std::endl; std::vectorint const random_vector_int{ create_random_vector(n, -16, 16, random_engine) }; std::cout Random Vector of Integers: std::endl; std::copy(random_vector_int.begin(), random_vector_int.end(), std::ostream_iteratorint(std::cout, )); std::cout std::endl; }
http://www.w-s-a.com/news/295826/

相关文章:

  • 分享几个x站好用的关键词微信商城小程序开发一般需要多少钱
  • 做韩国外贸网站wordpress手机版中文
  • 建站群赚钱有前途吗蚌埠北京网站建设
  • 北京网站建设求职简历十堰seo优化教程
  • 网站顶部可关闭广告微信小程序多少钱
  • 网站背景怎么弄斜杠青年seo工作室
  • ps个人网站首页怎么制作如何做网站的版块规划
  • 做网站的市场开源建站工具
  • 邹平做网站哪家好自动点击器app
  • 南阳seo网站排名优化wordpress文章对游客不显示
  • 网站301什么意思湛江市seo网站设计报价
  • 免费建造网站化妆品网络营销方案
  • 建公司网站wordpress the content
  • 网站的站点的管理系统建设银行网站注册企业
  • 长春火车站是哪个站做微商哪个网站有客源
  • 亚马逊培训费用一般多少seo专业培训课程
  • 做推文封面图网站南宁高端网站建设
  • 天津网站搜索排名做电影免费ppt模板下载网站
  • 襄樊最好网站建设价格网站建设与设计 毕业设计
  • 网站推广广告词大全集网站建设相对路径
  • 甘肃省铁路投资建设集团有限公司网站域名怎么实名认证
  • 企业网站建设的层次返利网站建设
  • 竞价单页网站制作中小企业网站建设问题
  • 响应式网站源码学校网站制作多少钱
  • 营销型网站建设需要懂什么网站建站四件套是什么
  • 廊坊哪里有制作手机网站的区块链开发语言
  • 找建设项目的网站装企工长网站开发
  • 戴尔网站建设成功方正网站制作
  • 怎么买网站域名wordpress 视频站模版
  • 厦门官网建设公司杨和关键词优化