// 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. 学习 MeteoInfo二次开发教程(二)

    1.注意TSB_Select_Click等几个名称要改为toolStripButton2_Click等. 2.以下代码的位置与public Form1()函数并行. ToolStripButton _ ...

  2. XAMPP 虚拟主机配置,实现多域名访问本地项目

    XAMPP 虚拟主机配置,实现多域名访问本地项目 1.首先你既然要配置多个虚拟主机,那你肯定需要多个站点的目录文件.你可以在e盘创建 www文件夹,然后在该文件件中新建两个站点目录,假设test.co ...

  3. 八(第一篇)、主体结构元素——article元素、section元素

    article元素 article元素代表文档.页面或应用程序中独立的.完整的.可以独自被外部引用的内容. 他可以是一篇博客或者报刊中的文章,一篇轮胎帖子.一段用户评论或独立的插件,或其他任何独立的插 ...

  4. python中赋值,深拷贝,浅拷贝区别

    这三种 的区别就是 复制的变量 是否是原变量的引用. 赋值:只是原变量的引用. 浅拷贝和深拷贝的区别 需要通过 子元素 区分 浅拷贝:子元素的 引用相同 深拷贝:所以引用都不相同,完全复制一份 这三种 ...

  5. CentOS 7 实现ssh无密码登录

    cd ~ 进入根目录. (使用ls -a或者 ls -la 能够看到当前文件夹下的所有文件包含隐藏文件夹等) 我们首先使用ls -la  发现并没有.ssh的文件夹存在. 在终端输入   ssh lo ...

  6. zabbix4.0下zabbix-agentd安装

    转:http://www.safecdn.cn/monitor/2018/12/zabbix4-0-zabbix-agentd-install/316.html 一 安装源和Zabbix的依赖包: 1 ...

  7. spring 之 类型转换 2

    spring内置的转换器 在spring xml 文件中,配置属性的时候, 不管实际是 list 还是map ,还是Date, 或者原生的java 类型, 我们只能配置xml 给它们. 那么 spri ...

  8. OpenGL中投影矩阵基础知识

    投影矩阵元素Projection Matrix 投影矩阵构建: 当f趋向于正无穷时: 一个重要的事实是,当f趋于正无穷时,在剪裁空间中点的z坐标跟w坐标相等.计算方法如下: 经过透视除法后,z坐标变为 ...

  9. ZStack串口通信

    要使用ZStack就不得不先了解ZStack的OSAL工作原理 http://blog.csdn.net/qinpeng_zbdx/article/details/20990797 http://we ...

  10. ARC下野指针 EXC_BAD_ACCESS错误

    一般都是多线程造成的,某一个线程在操作一个对象时,另一个线程将此对象释放,此时就有可能造成野指针的问题.一种解决办法是如果都是UI操作则将这些操作都放在主线程去执行. 通常出现此问题的地方都在RAC, ...