c++ 泛型编程 之 自动生成代码

http://download.csdn.net/detail/zhuyingqingfen/8457091

关于 C++ 泛型中的 TypeList ,参考  c++ 泛型编程 之 TypeLists

#ifndef GENSCATTERHIERARCHY_H_
#define GENSCATTERHIERARCHY_H_
#include "typelists.h"
#include "typetraits.h"

#if defined(_MSC_VER) && _MSC_VER >= 1300
// ‘class1‘ : base-class ‘class2‘ is already a base-class of ‘class3‘
#pragma warning( disable : 4584 )
#endif // _MSC_VER

//运用Typelists 自动产生Classes

//1. 产生“散乱的继承体系”(scattered hierarchies)
template<class TList,template<class>class Unit>class GenScatterHierarchy;

template<class T1,class T2,template<class>class Unit>
class GenScatterHierarchy<Typelist<T1,T2>,Unit>//如果第一个型别是TypeList,就递归产生GenScatterHierarchy<TList::Head,Unit>
	:public GenScatterHierarchy<T1,Unit>//和GenScatterHierarchy<TList::Tail,Unit>,并继承二者。
	,public GenScatterHierarchy<T2,Unit>
{
public:
	typedef Typelist<T1, T2> TList;
	typedef GenScatterHierarchy<T1, Unit> LeftBase;
	typedef GenScatterHierarchy<T2, Unit> RightBase;
};

template<class AtomicType,template<class>class Unit>//如果第一个型别是个单一型别(ActomicType,相对于Typelist
class GenScatterHierarchy : public Unit<AtomicType>// GenScatterHeierarchy便把该型别传递给Unit,然后继承Unit<T>
{
public:
	typedef Unit<AtomicType> LeftBase;
};
template<template<class> class Unit>
class GenScatterHierarchy<NullType,Unit>//空类
{

};

//2. 产生线性继承体系。
//1. 要求这个Unit有两个引数
//2. 要求Unit继承于Unit的第二个引数Base,这样GenLinearHierarchy才能生成串状继承结构
template<
	class TList,
	template<class AtomicType,class Base>class Unit,
	class Root = EmptyType
    >class GenLinearHierarchy;//声明

template<class T1,class T2,template<class,class>class Unit,class Root>
class GenLinearHierarchy<Typelist<T1,T2>,Unit,Root>
	: public Unit<T1,GenLinearHierarchy<T2,Unit,Root> >
{

};
template<class T,template<class,class>class Unit,class Root>
class GenLinearHierarchy<Typelist<T,NullType>,Unit,Root>
	:public Unit<T,Root>
{

};

//GenScatterHierarchy的访问辅助类
template<class TList,template<class>class Unit>
Unit<typename TList::Head>&FieldHelper(GenScatterHierarchy<TList, Unit>&obj,Int2Type<0>)
{
	GenScatterHierarchy<typename TList::Head,Unit>&leftBase = obj;
	return leftBase;
}
template<int i,class TList,template<class>class Unit>
Unit<typename TypeAt<TList,i>::Result>& FieldHelper(GenScatterHierarchy<TList,Unit>&obj,Int2Type<i>)
{
	GenScatterHierarchy<typename TList::Tail,Unit>& rightBase = obj;
	return FieldHelper(rightBase,Int2Type<i-1>());
}
template<int i,class TList,template<class>class Unit>
Unit<typename TypeAt<TList,i>::Result>&Field(GenScatterHierarchy<TList,Unit>&obj)
{
	return FieldHelper(obj,Int2Type<i>());
}

#endif

template<class T>
struct Holder
{
	T mValue;
};
void hierarchygenerators_Test()
{
	//GenScatterHierarchy
	typedef GenScatterHierarchy<TYPELIST_4(char,int,string,string),Holder> MyTestClass;
	MyTestClass obj;
	Field<0>(obj).mValue = ‘a‘;
	int i = Field<1>(obj).mValue;
	typedef TYPELIST_2(int,int) f;
	//GenLinearHierarchy
}
时间: 2024-10-05 11:28:11

c++ 泛型编程 之 自动生成代码的相关文章

json 对c++类的序列化(自动生成代码)

[动机] 之前写网络协议的时候,使用的是google protobuf,protobuf不但在性能和扩展性上有很好的优势,protoc自动生成c++类代码的工具,这点确实给程序员带来了很多便利. 做后面一项目使用的json格式来传输,然后就萌生了实现像protoc这样的工具,根据json文件来生成c++类代码,并且生成序列化代码,这样在写网络的时候就无需把jsonvalue序列化散落在各处. [思路] 之前写object-c的时候,如果你要对类的序列化,你必须实现NSCoding协议(接口),

ButterKnife的使用以及不能自动生成代码问题的解决

ButterKnife的使用以及不能自动生成代码问题的解决 转载请注明出处:http://www.cnblogs.com/zhengjunfei/p/5910497.html 最近换了个工作刚入职,又赔了配环境(linux),并且根据老大的要求看了一些相关的知识点,其中在用到有个工具的时候与到了一些奇葩的问题,就是ButterKnife的不能自动生成代码的问题,查了好多资料和博客才查到,现在总结一下,以备同为码农的程序员不时之需. 大家知道在我们android编程的时候,经常会遇到findVie

Mybatis 自动生成代码,数据库postgresql

最近做了一个项目,使用Mybatis自动生成代码,下面做一下总结,被以后参考: 一.提前准备: 1.工具类:mybatis-generator-core-1.3.2.jar 2.postgresql驱动:postgresql-9.2-1003-jdbc4.jar 3.xml文件 这些我都上传到了附件上,下载链接:Download 二.XML详解 咱们的核心配置文件:mybatisGeneratorConfig.xml <?xml version="1.0" encoding=&q

MyBatis使用Generator自动生成代码

MyBatis中,可以使用Generator自动生成代码,包括DAO层. MODEL层 .MAPPING SQL映射文件. 第一步:下载MyBatis的Generator工具 http://mybatis.github.io/generator/ 第二步:配置自动生成代码所需的XML配置文件,例如(generator.xml) 将这个文件保存至你下载的mybatis-generator-core-1.3.2文件夹下 第三步:进入XML配置文件(generator.xml)所在的的目录并执行命令:

【转】Mybits自动生成代码

一.构建一个环境 1. 首先创建一个表: [sql] view plaincopy CREATE TABLE t_user ( USER_ID INT NOT NULL AUTO_INCREMENT, USER_NAME CHAR(30) NOT NULL, USER_PASSWORD CHAR(10) NOT NULL, USER_EMAIL CHAR(30) NOT NULL, PRIMARY KEY (USER_ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf

maven插件mybatis-generator自动生成代码

在开发中ssm框架用的十分广泛.mybatis最为持久层框架,根据xml.或者注解映射数据.自己可以控制sql,灵活简单操作数据库.但是,所有的sql文件都是有自己编写,不仅繁琐,而且很耗时,在开发中,速度.效率很重要.所以很多基础sql是有规律可循,可以根据数据库字段自动生成的.下面就进入今天的主题,通过maven插件mybatis-generator自动生成代码. 1.环境配置,创建maven项目,在pom.xml添加插件配置. <build> <finalName>zsxt&

mybatis使用generator自动生成代码时的类型转换

使用mybatis的generator自动生成代码,但是oracle数据库中number(6,2)总是自动转成BigDecimal,我想要转成的是float类型 这样就写了一个类型转换器,需要继承JavaTypeResolver接口 然后在mybaties配置文件generatorConfig.xml中类型转换配置位置添加上即可 <javaTypeResolver type="com.generator.MyJavaTypeResolver"> <property n

Mybatis自动生成代码

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文将简要介绍怎样利用Mybatis Generator自动生成Mybatis的相关代码,Mybatis Generator是一个非常好用的工具,使用它可以大大节省开发的时间,并减少代码的编写量. 一.构建一个环境 1. 首先创建一个表: CREATE TABLE t_user ( USER_ID INT NOT NULL AUTO_INCREMENT, USER_NAME CHAR(

Java进阶之 如何自动生成代码

一.前言:为什么要有代码的自动生成? 对于这个问题 最简洁直接的回答就是:代替手动编写代码.提高工作效率. 什么样的场景和代码适合用自动生成这种方式呢? 做过Java服务端的朋友一定都知道代码中我们需要编写与数据库表映射的Java实体类(Entity).需要编写与实体对应的DAO类(XxDao.java类中有包含对应实体的增.删.改.查基本操作).在这些实体类中通常都是一些属性方法以及属性对应的get/set方法.而实体对应的DAO类中也基本会包含有增.删.改.查这些与数据库操作相关的方法.在编