模板学习实践一 accumulationtraits
// 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的更多相关文章
- 模板学习实践二 pointer
c++ template学习记录 使用模板将实际类型的指针进行封装 当变量退出作用域 自动delete // 1111.cpp : 定义控制台应用程序的入口点. // #include "s ...
- 模板学习实践三 functor
#include <iostream>#include <typeinfo> void foo(){ std::cout << "foo() called ...
- Nagios学习实践系列——配置研究[监控当前服务器]
其实上篇Nagios学习实践系列——基本安装篇只是安装了Nagios基本组件,虽然能够打开主页,但是如果不配置相关配置文件文件,那么左边菜单很多页面都打不开,相当于只是一个空壳子.接下来,我们来学习研 ...
- Nagios学习实践系列
其实上篇Nagios学习实践系列--基本安装篇只是安装了Nagios基本组件,虽然能够打开主页,但是如果不配置相关配置文件文件,那么左边菜单很多页面都打不开,相当于只是一个空壳子.接下来,我们来学习研 ...
- 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第四天】
https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...
- 使用sklearn进行集成学习——实践
系列 <使用sklearn进行集成学习——理论> <使用sklearn进行集成学习——实践> 目录 1 Random Forest和Gradient Tree Boosting ...
- Nagios学习实践系列——基本安装篇
开篇介绍 最近由于工作需要,学习研究了一下Nagios的安装.配置.使用,关于Nagios的介绍,可以参考我上篇随笔Nagios学习实践系列——产品介绍篇 实验环境 操作系统:Red Hat Ente ...
- 前端学习实践笔记--JavaScript深入【1】
这一年中零零散散看过几本javascript的书,回过头看之前写过的javascript学习笔记,未免有点汗颜,突出“肤浅”二字,然越深入越觉得javascript的博大精深,有种只缘身在此山中的感觉 ...
- Appium学习实践(四)结构优化
随着我们测试脚本中的用例越来越多,我们不可能将所有的用例都放在同一个脚本中,所以我们需要优化我们的结构.将脚本放在一个文件夹中,再通过别的脚本来执行脚本.这样,我们也可以有选择性的执行我们的脚本 先来 ...
随机推荐
- 【ELK】之Centos6.9_x64安装elasticsearch6.2.1
1.下载elasticsearch6.2.1 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.1 ...
- finstrument-functions
2017-12-03 23:59:16 参考 如何快速地在每个函数入口处加入相同的语句? https://www.zhihu.com/question/56132218 做个存档 scj@scjCom ...
- 刘志梅201771010115.《面向对象程序设计(java)》第二周学习总结
实验二 Java基本程序设计(1) 实验时间 2018-9-6 第一部分:理论知识学习 3.1一个简单的Java应用程序 关键字public称为访问修饰符,这些修饰符用于控制程序的其他部分对这段代码的 ...
- python中建模分析零息票收益率曲线--复利和连续复利
收益率曲线(Yield Curve)是显示一组货币和信贷风险均相同,但期限不同的债券或其他金融工具收益率的图表.纵轴代表收益率,横轴则是距离到期的时间.在此用python建模分析零息票收益率曲线,输出 ...
- 学习笔记 requests + BeautifulSoup
第一步:requests get请求 # -*- coding:utf-8 -*- # 日期:2018/5/15 17:46 # Author:小鼠标 import requests url = &q ...
- dubbo实现原理介绍
一.什么是dubbo Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看, ...
- leetcode136
public class Solution { public int SingleNumber(int[] nums) { Dictionary<int, int> dic = new D ...
- Nginx服务器的rewrite、全局变量、重定向和防盗链相关功能
一:Nginx 后端服务器组的配置: 1.upstream: 用于设置后端服务器组的主要指令,upstream类似于之前的server块或http块,用法如下: upstreame Myserver{ ...
- js:作用域总结1
先说几个概念: 1.js代码从上往下执行 2.变量提升: 变量提升是浏览器的一个功能,在运行js代码之前,浏览器会给js一个全局作用域叫window,window分两个模块,一个叫内存模块,一个叫运行 ...
- zabbix安装脚本
#!/bin/bash # #安装zabbix源.aliyun YUM源 #curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyu ...