`
isiqi
  • 浏览: 16701561 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

深入理解模板

阅读更多

模板有两类:函数模板和类模板。

无类型模板参数

默认模板参数

模板类型的模板参数

函数模板重载

编译时断言

//: C05:StaticAssert1.cpp {-xo}
// A simple, compile-time assertion facility
 
#define STATIC_ASSERT(x) \
  do { typedef int a[(x) ? 1 : -1]; } while(0)
 
int main() {
  STATIC_ASSERT(sizeof(int) <= sizeof(long)); // Passes
  STATIC_ASSERT(sizeof(double) <= sizeof(int)); // Fails
} ///:~
<style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style>

前面的内容说明了如何对编译时布尔表达式求值,。在效仿编译时断方面剩下的问题就是打印一个有意义的错误消息并且停止编译。所有的编译错误都要求编译器停止编译。解决这个问题的一个技巧是在错误消息中插入有用的文本。

//: C05:StaticAssert2.cpp {-g++}
#include <iostream>
using namespace std;
 
// A template and a specialization
template<bool> struct StaticCheck {
  StaticCheck(...);
};
 
template<> struct StaticCheck<false> {};
 
// The macro (generates a local class)
#define STATIC_CHECK(expr, msg) {             \
  class Error_##msg {};                       \
  sizeof((StaticCheck<expr>(Error_##msg()))); \
}
 
// Detects narrowing conversions
template<class To, class From> To safe_cast(From from) {
  STATIC_CHECK(sizeof(From) <= sizeof(To),
               NarrowingConversion);
  return reinterpret_cast<To>(from);
}
 
int main() {
  void* p = 0;
  int i = safe_cast<int>(p);
  cout << "int cast okay” << endl;
  //! char c = safe_cast<char>(p);
} ///:~
<style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style>

以上的代码理解起来比较困难,一个简单的方法是先展开

int i = safe_cast<int>(p);相当于

{                                                   
class Error_NarrowingConversion {};            
sizeof( StaticCheck<sizeof(void*) <= sizeof(int)>(Error_NarrowingConversion() ) );      
}

在这儿,sizeof(void*) <= sizeof(int)为模板类StaticCheck的参数,若其值为TRUE,则调用通用构造函数,否则,调用特化的类,此特化的类为一个空类,
无法接受参数Error_NarrowingConversion(),因此编译将出错。
<style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style>

表达式模板:

分享到:
评论

相关推荐

    深入理解JavaScript系列

    深入理解JavaScript系列(41):设计模式之模板方法 深入理解JavaScript系列(42):设计模式之原型模式 深入理解JavaScript系列(43):设计模式之状态模式 深入理解JavaScript系列(44):设计模式之桥接模式 ...

    《 C++模板》和《C++模板元编程》两本

    在《C++ Templates》这本书中,读者可以深入理解模板的基本概念,如模板声明、实例化、模板特化以及模板偏特化。书中可能涵盖了模板参数推断、模板元编程的入门知识,以及如何利用模板来实现泛型算法,如排序、查找...

    C++模板编程详解:模板函数、类、特化与SFINAE

    适合人群:具备一定C++基础,希望深入理解模板编程机制的研发人员。 使用场景及目标:适用于需要编写高效、通用、可扩展代码的项目。读者可以通过本文掌握模板编程的核心概念和技术,提升代码质量和性能。 其他说明...

    c++模板经典书籍

    在"两本很好的讲解c++ template的书"中,我们可以期待深入理解模板的各个方面,包括基本概念、特性和最佳实践。 首先,模板分为两种类型:函数模板和类模板。函数模板用于定义通用函数,如`std::swap`,可以接受...

    精美的OA页面模板

    解压并研究这些文件,开发者可以深入理解模板的结构和实现方式,进一步定制或修改以满足特定需求。 总的来说,一个精美的OA页面模板是实现高效办公环境的关键,它不仅需要美观的设计,还需要功能强大、易用性和可...

    themeforest 模板,企业展示模板

    【主题】:themeforest 企业展示模板 在IT领域,网页设计和开发是一个至关重要的环节,特别是对于...通过深入理解模板的结构、组件以及如何进行定制,你可以根据自身需求打造出一个既反映企业特色又能吸引用户的网站。

    C++模板详解

    通过深入理解模板的基本概念、类型和函数模板、模板特化以及模板元编程,开发者可以编写出更加高效、通用的代码,为软件开发带来极大的便利。通过阅读提供的"C++模板详解.pdf"文档,你将能更全面地掌握这些知识点,...

    OpenCV模板匹配程序

    OpenCV(开源计算机视觉库)是一个强大的工具集,专门用于图像处理和计算机视觉任务。在这个“OpenCV模板匹配程序”中,我们...通过对这个程序的研究,我们可以深入理解模板匹配的工作原理,并将其应用于实际项目中。

    VISUAL C++ 6.0 模板库参考手册

    总的来说,《Visual C++ 6.0 模板库参考手册》是学习和精通C++模板库的宝贵资源,它将帮助开发者深入理解模板的概念,熟练应用STL,以及解决与模板相关的常见问题。通过学习这部手册,开发者可以充分利用C++模板的...

    C++模板(2024最全)

    读者可以通过本书全面了解C++模板的核心概念,掌握模板的语法和语义,深入理解模板元编程的原理与应用。无论是为了优化代码结构、提高代码复用性,还是在高性能计算和系统开发中应用模板技术,本书都能提供必要的...

    模板匹配Matlab程序

    总的来说,这个Matlab程序应该包含了上述过程的实现,通过学习和理解这段代码,我们可以深入理解模板匹配的原理,以及如何在实际应用中运用这些技术。对于想要深入数字图像处理的学者和工程师而言,这是一个非常有...

    PHP实例开发源码-PHP费尔模板引擎.zip

    在这个实例开发源码中,我们可以深入理解模板引擎的工作原理,以及如何在实际项目中应用它。 1. **模板引擎的概念**: 模板引擎是用于将数据和视图分离的技术,它允许开发者使用特定的语法在HTML文件中插入变量和...

    TemplateEngin(模板引擎(标签解析)示例源码).

    TemplateEngin是一个用于处理动态内容和数据的模板引擎,它主要负责将静态的HTML模板与动态数据结合,生成最终的HTML页面。...对于想要深入理解模板引擎工作原理的开发者,这是一个非常有价值的资源。

    WordPress网站模板

    WordPress网站模板是构建在线存在的一种强大工具,尤其适合那些希望通过个性化设计吸引访客的网站所有者。...通过深入理解模板的工作原理,结合有效的学习资源,您可以轻松创建出符合业务需求的个性化网站。

    ae音乐可视化模板_AE模板_源码.zip

    通过查看和修改这些源码,用户可以深入理解模板的工作原理,甚至自定义更复杂的音乐可视化效果。 在实际应用中,这个模板和源码可以极大地提高音乐可视化的工作效率。对于初学者,可以直接使用模板快速创建出吸引人...

    VC++深入理解源码

    《VC++深入理解源码》是一本专注于解析VC++编程语言内部机制的书籍,作者孙鑫通过详尽的代码分析,带领读者深入了解VC++的源码实现,旨在提高读者对C++编译器、运行库以及相关开发工具的深度认识。这本书不仅适合有...

    施工组织设计常用CAD图-模板工程.zip

    同时,对于学习建筑施工技术的人来说,这些图纸也是宝贵的教育资源,能深入理解模板工程的设计原理和施工工艺。 总的来说,“施工组织设计常用CAD图-模板工程.zip”这个资源是建筑行业中一个实用的工具,它包含的...

    深入编程内幕——VISUAL C++

    深入理解模板类和模板函数对于编写高效、灵活的库或组件至关重要。 8. **调试与性能优化**:Visual C++提供了强大的调试工具,书中会讲解如何有效地使用这些工具定位和解决问题。此外,还会讨论性能优化策略,包括...

    深入理解c++11pdf

    《深入理解C++11》是一本专注于C++11...总的来说,《深入理解C++11》这本书详尽地探讨了C++11的新特性,包括对多态性、继承构造函数和模板使用的增强,这些改进使得C++更加强大且易用,提高了代码的可靠性和可维护性。

    模板匹配技术

    更深入理解模板匹配技术,能够独立根据已知算法(相关匹配(Correlation Matching)、基于Hausdorff距离匹配方法 及考虑对场景图象距离变换(Distance Transform)的Hausdorff距离匹配方法)在MATLAB下编程实现相关...

Global site tag (gtag.js) - Google Analytics