模板学习实践一 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学习实践(四)结构优化
随着我们测试脚本中的用例越来越多,我们不可能将所有的用例都放在同一个脚本中,所以我们需要优化我们的结构.将脚本放在一个文件夹中,再通过别的脚本来执行脚本.这样,我们也可以有选择性的执行我们的脚本 先来 ...
随机推荐
- python之路——9
王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594 学习内容 1.文件处理 1.打开文件 open(‘路径’,‘打开方式’) 打开方式 r w a r+ w+ ...
- iframe-父子-兄弟页面相互传值(jq和js两种方法)
参考文章: http://blog.csdn.net/u013299635/article/details/78773207 http://www.cnblogs.com/xyicheng/archi ...
- npm安装与使用
NPM 使用介绍 摘自:http://www.runoob.com/nodejs/nodejs-npm.html NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题, ...
- docker 学习(九) docker部署静态网站
一: dockerfile, 把Dockerfile和myfolder放在一个目录下: FROM httpd:2.4 COPY ./myfolder/ /usr/local/apache2/htdo ...
- FlexItem 多行测试
flex: <!doctype html> <html> <head> <meta charset="utf-8"> <tit ...
- android 开发 View _15 导入一张图片将它裁剪成圆形 与 paint图层叠加处理详解
方法一: /* 实现思维是这样的: 1.首先拿到bitmap图片 2.得到bitmap图片的高度 宽度,并且计算好各个画图尺寸 3.创建一个空白的 bitmap图片: Bitmap output = ...
- Merge Into 语句代替Insert/Update在Oracle中的应用实战
动机: 想在Oracle中用一条SQL语句直接进行Insert/Update的操作. 说明: 在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录 ...
- Django模板语言相关内容 Djan
Django模板语言相关内容 Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...
- Rabbitmq(7) confirm模式
1. //将通道设置为comfirm模式channel.confirmSelect(); // 消息确认if(!channel.waitForConfirms()){ System.out.print ...
- ---dd io测试
下面是一个简单测试,虽然不够准确但是简单立即可行, 当前目录的IO写读测试: (写) dd if=/dev/zero of=test bs=64k count=16k conv=fdatasync ( ...