随笔分类 - C++ template
摘要:最近在看数据结构,于是乎就自动动手写个简单的Vector:#ifndef _CUSTOM_STRUCT#define _CUSTOM_STRUCT#define CAPACITY_VOLUMN 1000template<class object>class CustomVector{ typedef object* iterator; typedef object* const const_iterator;private: int size; int capacity; object* objects; void Reserve(int newSize) { object* ol
阅读全文
摘要:摘自《Sun Studio 12: C++ 用户指南》 第 6.7.3 节模板在使用前必须先声明。一个友元声明构成了模板的使用,而非模板的声明。 (A friend declaration constitutes a use of the template, not a declaration of the template. )所以实际的模板声明必须在友元声明之前。例如,编译系统尝试链接以下示例中生成的目标文件时,对未实例化的operator<<函数,会生成一个未定义的错误。示例6–2 友元声明问题的示例// array.h// generates undefined error
阅读全文
摘要:错误消息在函数“function”中引用了无法解析的外部符号“symbol”在 function 中找到了未定义的外部符号 (symbol)。若要解决此错误,请提供符号定义或移除引用它的代码。一般报错如下:error LNK2001: 无法解析的外部符号 "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<c
阅读全文
摘要:当授予对给定模板的实例的访问权时候,在作用域中不需要存在该类模板或函数模板的声明。实质上,编译器将友元声明也当作类或函数的声明对待(When we grant access to all instances of a given template, there need not be a declaration for that class or function template in scope. Essentially, the compiler treats the friend declaration as a declaration of the class or function
阅读全文
摘要:表达式模板是一种C++模板元编程(template metaprogram)技术。典型情况下,表达式模板自身代表一种操作,模板参数代表该操作的操作数。模板表达式可将子表达式的计算推迟,这样 有利于优化(特别是减少临时变量的使用)。表达式模板也可以作为参数传递给一个函数。例子:我们实现一个用来求表达式 x = 1.2*x + x*y 的模板表达式,其中x、y为数组//exprarray.h#include <stddef.h>#include <cassert>#include "sarray.h"template<typename T>c
阅读全文
摘要:metaprogramming含有“对一个程序进行编程”的意思,换句话说,编程系统会执行我们所写的代码,来生成新的代码,而这些新代码才正真体现了我们所期望的功能。通常而言,metaprogramming这个概念意味着一种发射的特性:metaprogramming组件只是程序的一部分,而且它也只生一部分代码或者程序。我们为什么需要metaprogramming呢?和大多数程序设计技术一样,使用metaprogramming的目的是为了实现更多的功能,并且使花费的开销更小,其中开销是以:代码大小、维护的开销等来衡量的。另一方面,metaprogramming的最大特点在于:木屑用户自定义的计算可.
阅读全文
摘要:之前我们为了实现一个累积的policy,我们选择把SumPolicy和MutPolicy实现为具有成员模版的普通类,这里,还存在另一种实现方法,即使用类模板来实现这个policy class接口:#ifndef SUMPOLICY_H#define SUMPOLICY_Htemplate<typename T1,typename T2>class SumPolicy{public: static void accumulate(T1& total,T2 const & value) { total += value; }};#endif我们对累积求和类Accum的接
阅读全文
摘要:在上一节中所使用的trait被称为fixed trait,因为一旦定义了这个分离的trait,就不能在算法中对它进行改写,然而,在有些情况下,我们需要对trait进行改写。例如:我们可能偶尔发现可以对一组float值进行求和,然后很安全的把和值存储在一个具有相同类型(即float型)的变量里面,而且这样通常会给我们带来更高的效率。因此,我们更改我们的求和模版://accum5.h#ifndef ACCUM_H#define ACCUM_H#include"accumtraits4.h"template<typename T,typename AT = Accumula
阅读全文
摘要:在上节的代码中,构造函数AccT()不一定会返回一个符合条件的值,而且类型AccT也不一定具有一个缺省的构造函数。我们可以再次使用trait来解决这个函数。//accumtraits3.htemplate<typename T>class AccumulationTraits;template<>class AccumulationTraits<char>{public: typedef int AccT; static AccT const zero = 0;};template<>class AccumulationTraits<sho
阅读全文
摘要:要求:编写一个能适合许多类型的模板来完成一个累加操作解答1://定义一个模板函数#ifndef ACCUM_H#define ACCUM_Htemplate<typename T>inlineT accum(T const* beg,T const* end){ T total=T();//假设T()事实上会产生一个等于0的值 while(beg != end) { total += *beg; ++beg; } return total;}#endif解析:上面的代码,有两个问题:(1)如何正确生成一个0值,以便开展我们的求和过程。(...
阅读全文

浙公网安备 33010602011771号