// 11111.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <string> template<typename T>
class AccumulationTraits; template<>
class AccumulationTraits<char> {
public:
typedef int Acct;
static Acct zero() {
return 0;
}
}; template<>
class AccumulationTraits<int> {
public:
typedef long Acct;
static Acct zero() {
return 0;
}
}; template<>
class AccumulationTraits<float> {
public:
typedef double Acct;
static Acct zero() {
return 0;
}
};
/*
template<typename T,typename AT = AccumulationTraits<T> >
class Accum {
public:
static typename AT::Acct accum(T const* beg, T const* end) {
typename AT::Acct total = AT::zero();
while (beg != end)
{
total += *beg;
++beg;
}
return total;
}
}; template<typename T>
typename AccumulationTraits<T>::Acct accum(T const* beg, T const* end)
{
std::cout << "T" << std::endl;
return Accum<T>::accum(beg,end);
} template<typename Traits, typename T>
typename AccumulationTraits<T>::Acct accum(T const* beg, T const* end)
{
std::cout << "T Traits" << std::endl;
return Accum<T,Traits>::accum(beg, end);
}
*/
template<typename T1, typename T2>
class SumPolicy {
public:
static void accumulate(T1& total, T2 const& value) {
total += value;
}
}; template<typename T,
template<typename,typename>class Policy = SumPolicy,
typename Traits = AccumulationTraits<T> >
class Accum {
public:
typedef typename Traits::Acct Acct;
static Acct accum(T const* beg,T const* end) {
Acct total = Traits::zero();
while (beg != end)
{
Policy<Acct, T>::accumulate(total, *beg);
++beg;
}
return total;
} }; int main()
{
int num[] = { 1,2,3,4,5 };
std::cout << Accum<int>::accum(&num[0],&num[5]) << std::endl; return 0;
}

  

// 11111.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
#include <string> template<typename T>
class AccumulationTraits; template<>
class AccumulationTraits<char> {
public:
typedef int Acct;
static Acct zero() {
return 0;
}
}; template<>
class AccumulationTraits<int> {
public:
typedef long Acct;
static Acct zero() {
return 0;
}
}; template<>
class AccumulationTraits<float> {
public:
typedef double Acct;
static Acct zero() {
return 0;
}
};
/*
template<typename T,typename AT = AccumulationTraits<T> >
class Accum {
public:
static typename AT::Acct accum(T const* beg, T const* end) {
typename AT::Acct total = AT::zero();
while (beg != end)
{
total += *beg;
++beg;
}
return total;
}
}; template<typename T>
typename AccumulationTraits<T>::Acct accum(T const* beg, T const* end)
{
std::cout << "T" << std::endl;
return Accum<T>::accum(beg,end);
} template<typename Traits, typename T>
typename AccumulationTraits<T>::Acct accum(T const* beg, T const* end)
{
std::cout << "T Traits" << std::endl;
return Accum<T,Traits>::accum(beg, end);
}
*/
template<bool b = true>
class SumPolicy {
public:
template<typename T1, typename T2>
static void accumulate(T1& total, T2 const& value) {
total += value;
}
}; template<>
class SumPolicy<false> {
public:
template<typename T1, typename T2>
static void accumulate(T1& total, T2 const& value) {
total = total+value;
}
}; template <typename T,
typename Policy = SumPolicy<>,
typename Traits = AccumulationTraits<T> >
class Accum {
public:
typedef typename Traits::Acct Acct;
static Acct accum(T const* beg, T const* end) {
Acct total = Traits::zero();
while (beg != end) {
Policy::accumulate(total, *beg);
++beg;
}
return total;
}
}; int main()
{
int num[] = { 1,2,3,4,5 };
std::cout << Accum<int>::accum(&num[0], &num[5]) << std::endl;
std::cout << Accum<int,SumPolicy<false>>::accum(&num[0],&num[5]) << std::endl;
std::cout << Accum<int, SumPolicy<true>>::accum(&num[0], &num[5]) << std::endl; return 0;
}

  

// 111111.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"
#include <iostream> template<typename T>
class IsFundaT {
public:
enum{Yes = 0,No=1};
}; #define MK_FUNDA_TYPE(T) \
template<> class IsFundaT<T> { \
public: \
enum{Yes =1,No=0}; \
};
MK_FUNDA_TYPE(void)
MK_FUNDA_TYPE(bool)
MK_FUNDA_TYPE(signed char)
MK_FUNDA_TYPE(unsigned char)
MK_FUNDA_TYPE(wchar_t) MK_FUNDA_TYPE(signed short)
MK_FUNDA_TYPE(unsigned short)
MK_FUNDA_TYPE(signed int)
MK_FUNDA_TYPE(unsigned int)
MK_FUNDA_TYPE(signed long)
MK_FUNDA_TYPE(unsigned long)
#if LONGLONG_EXISTS
MK_FUNDA_TYPE(signed long long)
MK_FUNDA_TYPE(unsigned long long)
#endif // LONGLONG_EXISTS MK_FUNDA_TYPE(float)
MK_FUNDA_TYPE(double)
MK_FUNDA_TYPE(long double) //====================================================== template<typename T>
void test(T const& t) {
if (IsFundaT<T>::Yes) {
std::cout << "T is fundamental type" << std::endl;
}
else
{
std::cout << "T is no fundamental type" << std::endl;
}
} class MyType{ }; int main()
{
int i = 9;
auto ii = std::move(i);
test(ii);
test(7);
test(MyType()); return 0;
}

  

模板学习实践一 accumulationtraits的更多相关文章

  1. 模板学习实践二 pointer

    c++ template学习记录 使用模板将实际类型的指针进行封装 当变量退出作用域 自动delete // 1111.cpp : 定义控制台应用程序的入口点. // #include "s ...

  2. 模板学习实践三 functor

    #include <iostream>#include <typeinfo> void foo(){ std::cout << "foo() called ...

  3. Nagios学习实践系列——配置研究[监控当前服务器]

    其实上篇Nagios学习实践系列——基本安装篇只是安装了Nagios基本组件,虽然能够打开主页,但是如果不配置相关配置文件文件,那么左边菜单很多页面都打不开,相当于只是一个空壳子.接下来,我们来学习研 ...

  4. Nagios学习实践系列

    其实上篇Nagios学习实践系列--基本安装篇只是安装了Nagios基本组件,虽然能够打开主页,但是如果不配置相关配置文件文件,那么左边菜单很多页面都打不开,相当于只是一个空壳子.接下来,我们来学习研 ...

  5. 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第四天】

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...

  6. 使用sklearn进行集成学习——实践

    系列 <使用sklearn进行集成学习——理论> <使用sklearn进行集成学习——实践> 目录 1 Random Forest和Gradient Tree Boosting ...

  7. Nagios学习实践系列——基本安装篇

    开篇介绍 最近由于工作需要,学习研究了一下Nagios的安装.配置.使用,关于Nagios的介绍,可以参考我上篇随笔Nagios学习实践系列——产品介绍篇 实验环境 操作系统:Red Hat Ente ...

  8. 前端学习实践笔记--JavaScript深入【1】

    这一年中零零散散看过几本javascript的书,回过头看之前写过的javascript学习笔记,未免有点汗颜,突出“肤浅”二字,然越深入越觉得javascript的博大精深,有种只缘身在此山中的感觉 ...

  9. Appium学习实践(四)结构优化

    随着我们测试脚本中的用例越来越多,我们不可能将所有的用例都放在同一个脚本中,所以我们需要优化我们的结构.将脚本放在一个文件夹中,再通过别的脚本来执行脚本.这样,我们也可以有选择性的执行我们的脚本 先来 ...

随机推荐

  1. XShell停止滚屏,禁止滚动

     Ctrl+S:锁定当前屏幕  Ctrl+Q:解锁当前屏幕 Ctrl+Alt+]  进入命令输入状态

  2. [转][C#]程序的动态编译

    转自:https://blog.csdn.net/clb929/article/details/51385399 附 文件下载

  3. js基础系列之【原型和原型链】

    声明:形成本文的出发点仅仅是个人总结记录,避免遗忘,并非详实的教程:文中引用了经过个人加工的其它作者的内容,并非原创.学海无涯 引入问题 一般我们是这样写的: (需求驱动技术,疑问驱动进步) // 构 ...

  4. Python + Robot Framework 环境搭建

    一.Python 安装 说明:由于RIDE是基于python2.x开发,后期未做python3.x兼容,所以这里安装python2.7. 链接: https://pan.baidu.com/s/1yf ...

  5. sql常用语句备忘录随时更新

    一.查询最新的一条数据 SELECT * FROM Table a WHERE NOT EXISTS (SELECT FROM Table b WHERE a.Date>b.Date) 二.查询 ...

  6. 什么是Java序列化,如何实现java序列化

      简要解释: 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间. 序列化是为了解决在对对象流进行读写操作时所 ...

  7. android 开发 View _1_ View的子类们 和 视图坐标系图

    目录: android 开发 View _2_ View的属性动画ObjectAnimator ,动画效果一览 android 开发 View _3_ View的属性动画ValueAnimator a ...

  8. jquery.cookie用法及其注意点

    jquery.cookie是一个轻量级的cookie插件,由于已被封装好,可拿来即用. 基本的创建.读取.删除见另一篇文章 浅谈localStorage.sessionStorage 与cookie  ...

  9. spring jdbc学习1

    1.queryForObject - 其中的 RowMapper 指定如何去映射结果集的行, 常用的实现类为 BeanPropertyRowMapper - 使用 SQL 中列的别名完成列名和类的属性 ...

  10. python中os模块

    os  模块 操作系统模块,该模块主要处理与操作系统相关的操作 最常用是文件操作:打开.读取 import os os.getcwd() #获取当前执行文件夹路径 ​ os.chdir('dirnam ...