// traits 的应用

///////////////////////////////////////////

// traits
template <typename T>
class sigmaTraits
{}; // 特化
template <>
class sigmaTraits<char>
{
public:
typedef int returnType;
}; template <>
class sigmaTraits<int>
{
public:
typedef int returnType;
}; template <>
class sigmaTraits<float>
{
public:
typedef double returnType;
}; template <>
class sigmaTraits<double>
{
public:
typedef double returnType;
}; /////////////////////////////////////////// #if 0
// char 溢出
template <typename T>
inline T Sigma(const T const* start, const T const* end)
{
typedef T ReturnType;
ReturnType s = ReturnType();
while (start != end)
{
s += *start++;
} return s;
}
#endif // 1 #if 1
// 需要 trait 技术
template <typename T>
inline typename sigmaTraits<T>::returnType Sigma(const T const* start, const T const* end)
{
typedef typename sigmaTraits<T>::returnType ReturnType;
ReturnType s = ReturnType();
while (start != end)
{
s += *start++;
} return s;
}
#endif // 1 int main()
{
// 需要 trait 技术才能保证计算结果正确。避免char溢出导致结果错误。
char str[] = "abc";
size_t len = strlen(str);
char* pB = str;
char* pE = str + len; printf("%d", Sigma(pB, pE));
}

  

C++ trais技术 模板特化的应用的更多相关文章

  1. C++-函数模板特化如何避免重复定义

     我正在用一个基于模板的库源代码,该库包含一些针对特定类型的模板函数特化.类模板,函数模板和模板函数特化都在头文件中.我在我的.cpp文件中 #include 头文件并编译链接工程.但是为了在整个工程 ...

  2. C++ Primer 学习笔记_84_模板与泛型编程 --模板特化

    模板与泛型编程 --模板特化 引言: 我们并不总是能够写出对全部可能被实例化的类型都最合适的模板.某些情况下,通用模板定义对于某个类型可能是全然错误的,通用模板定义或许不能编译或者做错误的事情;另外一 ...

  3. C++ Primer 学习笔记_85_模板与泛型编程 --模板特化[续]

    模板与泛型编程 --模板特化[续] 三.特化成员而不特化类 除了特化整个模板之外,还能够仅仅特化push和pop成员.我们将特化push成员以复制字符数组,而且特化pop成员以释放该副本使用的内存: ...

  4. C++程序设计方法4:模板特化

    模板参数的具体化/特殊化 有时,有些类型不适用,则需要对模板进行特殊化处理,这称为“模板特化” 对函数模板,如果有多个模板参数,则特化时必须提供所有参数的特例类型,不能部分特化: 如: char *s ...

  5. C++ template —— 模板特化(五)

    本篇讲解模板特化-------------------------------------------------------------------------------------------- ...

  6. C++ 模板特化以及Typelist的相关理解

    近日,在学习的过程中第一次接触到了Typelist的相关内容,比如Loki库有一本Modern C++ design的一本书,大概JD搜了一波没有译本,英文版600多R,瞬间从价值上看到了这本书的价值 ...

  7. 转:C++模板特化的概念

    http://blog.csdn.net/yesterday_record/article/details/7304025 很久没有看C++,在看STL源码剖析时,看到一个function templ ...

  8. oop &&GP 模板 ---> 特化和偏特化

    OOP面向对象编程 GP泛型编程(generic programming) 两者的主要区别就是OOP将数据和对数据的操作放在一起, GP就是将数据和操作独立开来 GP:   数据就是container ...

  9. C++模板特化编程

    在C++中,模板特化是除了类之外的一种封装变化的方法.模板特化可以通过编译器来对不同的模板参数生成不同的代码. 模板特化通常以模板结构体作为载体.常用技法包括:类型定义.静态成员常量定义和静态成员函数 ...

随机推荐

  1. mybatis之关联关系

    前言:在我们之前的hibernate中我们是学过了关联关系的,所以我们在本章给讲一讲mybatis的关联关系. mybatis的关联关系一对多的测试1.通过逆向工程生成Hbook,HbookCateg ...

  2. JVM-2-JVM结构

    什么是JVM        JVM是可运行Java代码的假想计算机 (或者理解为一种规范),包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收,堆 和 一个存储方法域.JVM是运行在操作系统之上的 ...

  3. Dom对象与jQuery对象的互转

    1.Dom对象转换为jQuery对象 a.直接获取视频,得到就是jQuery对象 $('video'); b.我们已经使用原生js,获取过来 Dom对象 var myvide = document.q ...

  4. JAVA实现二维码生成加背景图

    pom.xml依赖 <!-- 二维码生成 -->         <!-- https://mvnrepository.com/artifact/com.google.zxing/c ...

  5. 从傅里叶变换(FFT)到数论变换(NTT)

    FFT可以用来计算多项式乘法,但是复数的运算中含有大量的浮点数,精度较低.对于只有整数参与运算的多项式,有时,\(\text{NTT(Number-Theoretic Transform)}\)会是更 ...

  6. CF1248E Queue in the Train

    题目链接 problem 火车上的一列人要去排队接水.每个人都会在某个特定的时刻口渴.口渴之后他要去排队接水,如果他前面的座位有人已经在排队或者正在接水,那么他就不会去排队.否则他就会去排队.每个人接 ...

  7. php精确计算

    php BC高精确度函数库 结果: php一般的取余 只是除以整数 bc精度取余 精确到了小数

  8. Nginx超时设定

    最近针对公司的goscon网关发了一个PR,新增了握手阶段的超时判定.现在回顾一下Nginx的所有超时判定,看看目前还缺少哪些判定 ngx_http_core_module包含的timeout: cl ...

  9. C# get files and write the files full name in txt

    static void GetAllFiles() { string path = "filepath"; var allFiles = Directory.GetFiles(pa ...

  10. Docker实用debug调试技巧锦集

    阅读约 20 分钟 『重用』容器名 但我们在编写/调试Dockerfile的时候我们经常会重复之前的command,比如这种docker run --name jstorm-zookeeper zoo ...