1994年,C++标准委员会在圣迭哥举行的一次会议期间Erwin Unruh展示了一段可以产生质数的代码。这段代码的特别之处在于质数产生于编译期而非运行期,在编译器产生的一系列错误信息中间夹杂着从2到某个设定值之间的所有质数:// Prime number computation by Erwin Unruh
template <int i> struct D { D(void*); operator int(); };
template <int p, int i> struct is_prime {
enum { prim = (p%i) && is_prime<(i > 2 ? p : 0), i -1> :: prim };
};
template < int i > struct Prime_print {
Prime_print<i-1> a;
enum { prim = is_prime<i, i-1>::prim };
void f() { D<i> d = prim; }
};
struct is_prime<0,0> { enum {prim=1}; };
struct is_prime<0,1> { enum {prim=1}; };
struct Prime_print<2> { enum {prim = 1}; void f() { D<2> d = prim; } };
#ifndef LAST
#define LAST 10
#endif
main () {
Prime_print<LAST> a;
}
复制代码 类模板D只有一个参数为void*的构造器,而只有0才能被合法转换为void*。1994年,Erwin Unruh采用Metaware 编译器编译出错信息如下(以及其它一些信息,简短起见,它们被删除了):| Type `enum{}′ can′t be converted to txpe `D<2>′ ("primes.cpp",L2/C25).
| Type `enum{}′ can′t be converted to txpe `D<3>′ ("primes.cpp",L2/C25).
| Type `enum{}′ can′t be converted to txpe `D<5>′ ("primes.cpp",L2/C25).
| Type `enum{}′ can′t be converted to txpe `D<7>′ ("primes.cpp",L2/C25).
复制代码 如今,上面的代码已经不再是合法的C++程序了。以下是Erwin Unruh亲手给出的修订版,可以在今天符合标准的C++编译器上进行编译:// Prime number computation by Erwin Unruh
template <int i> struct D { D(void*); operator int(); };
template <int p, int i> struct is_prime {
enum { prim = (p==2) || (p%i) && is_prime<(i>2?p:0), i-1> :: prim };
};
template <int i> struct Prime_print {
Prime_print<i-1> a;
enum { prim = is_prime<i, i-1>::prim };
void f() { D<i> d = prim ? 1 : 0; a.f();}
};
template<> struct is_prime<0,0> { enum {prim=1}; };
template<> struct is_prime<0,1> { enum {prim=1}; };
template<> struct Prime_print<1> {
enum {prim=0};
void f() { D<1> d = prim ? 1 : 0; };
};
#ifndef LAST
#define LAST 18
#endif
main() {
Prime_print<LAST> a;
a.f();
}
复制代码 在GNU C++ (MinGW Special) 3.2中编译这段程序时,编译器将会给出如下出错信息(以及其它一些信息,简短起见,它们被删除了):Unruh.cpp:12: initializing argument 1 of `D<i>::D(void*) [with int i = 17]'
Unruh.cpp:12: initializing argument 1 of `D<i>::D(void*) [with int i = 13]'
Unruh.cpp:12: initializing argument 1 of `D<i>::D(void*) [with int i = 11]'
Unruh.cpp:12: initializing argument 1 of `D<i>::D(void*) [with int i = 7]'
Unruh.cpp:12: initializing argument 1 of `D<i>::D(void*) [with int i = 5]'
Unruh.cpp:12: initializing argument 1 of `D<i>::D(void*) [with int i = 3]'
Unruh.cpp:12: initializing argument 1 of `D<i>::D(void*) [with int i = 2]'
复制代码 这个例子展示了可以利用模板实例化机制于编译期执行一些计算。这种通过模板实例化而执行的特别的编译期计算技术即被称为模板元编程。
顺便说一句,因为编译器的出错信息并未被标准化,所以,如果你在Visual C++、Borland C++等编译器上看不到这么详细的出错信息,请不必讶异。
原文出自【比特网】,转载请保留原文链接:http://bbs.chinabyte.com/thread-373493-1-1.html
分享到:
相关推荐
Eckel有20年专业编程经验,并自1986年起教育人们如何撰写面向对象程序,足迹遍及全球,成为一位知名的 C++教师和顾问,如今兼涉Java。他是C++标准委员会拥有表决权的成员之一,曾经写过另五本面向对象编程书籍,发表...
- **第1章:对象导言**:介绍面向对象编程的基本概念。 - **第2章:对象的创建与使用**:讲解如何创建和使用对象,涵盖了现代面向对象设计的原则。 - **第3章:C++中的C**:介绍C语言的基本知识,为学习C++打下基础...
《c++编程思想》是由Bruce Eckel编写的一本书籍。本书的内容、讲授方法,选用例子和跟随的练习,别具特色。作者Bruce Eckel不是按传统的方法讲解C++的概念和编程方法,而是根据他自己过去学习C++的亲身体会,根据他...
#### 一、导言:编程五大原则 - **简洁原则**:代码应尽可能简单明了,避免不必要的重复。例如,在定义常量时使用`const`关键字来减少书写重复的数值或字符串,如`const double PI = 3.14159265;`。 - **安全原则**...
### C++编程思想核心知识点解析 #### 一、对象导言与抽象过程 **1.1 抽象的过程** 在C++中,抽象是面向对象编程(OOP)的核心概念之一。它指的是通过创建抽象的数据类型来模拟现实世界中的实体或概念。抽象的主要...
3. **模板编程**:C++引入了模板机制,使得函数和类可以处理多种数据类型。 4. **标准库**:C++提供了一个强大的标准库,包括容器类、算法和输入输出流等。 5. **内存管理**:C++提供了低级的内存管理方式,如指针...
- **思想层面**:C++支持多种编程范式,包括过程化编程、面向对象编程(OOP)、泛型编程等。 - **模型层面**:C++背后的对象模型和设计模式,这些是理解高级特性的关键。 #### 二、C++的四大编程范式 - **过程化编程...
利用模板元编程可以提升代码的灵活性,但也要注意其复杂性。 11. **内存管理** 正确使用动态内存分配和释放,避免内存泄漏。理解智能指针(如`std::unique_ptr`、`std::shared_ptr`)的使用场景。 以上只是C++...
### C++程序设计语言特别版第三版:关键知识点...通过本书的学习,不仅可以掌握C++的基础语法和标准库使用方法,还能深入了解面向对象编程、模板编程等高级主题。无论是初学者还是有经验的开发者,都能从中受益匪浅。
- **对象导言**: 对象的概念和 C++ 中对象的使用。 - **友元、句柄类、初始化与清除**: 涉及到 C++ 特有的概念和机制。 - **函数重载、联合、默认参数**: 函数和数据类型的高级用法。 - **常量、内联函数、模板**: ...
通过深入学习本书第一章的内容,读者不仅能巩固C++的基础知识,还能掌握一些高级特性,如模板、递归和异常处理等。此外,通过实际的编程练习,读者能够更好地理解和应用这些概念,为后续深入学习数据结构与算法打下...
8. **类与模板类**:面向对象编程的基本单元,模板类则支持泛型编程。 9. **类的共享成员、保护成员和私有成员**:控制成员的访问级别。 10. **友元**:允许特定的函数或类访问类的私有和保护成员。 11. **操作符...
- **泛型编程与STL**:文章深入探讨了泛型编程的概念及其在C++中的实现——标准模板库(STL)。STL是C++标准库的重要组成部分,包含了大量泛型算法和容器,极大地提高了程序的复用性和效率。 - **模板分离编译**:...
在XML中,就是要将网页也作为一个对象来操作和控制,我们可以建立自己的对象和模板。与对象进行交流,如何命令对象,就要用到API。API全称Application Programming Interface,它是访问和操作对象的规则。而DOM就是...