C++ traits编程技法之__type_traits源码分享
时间:2018-11-09
本文章向大家介绍C++ traits编程技法之__type_traits源码分享,需要的朋友可以参考一下
Custom Type Based on Type Traits
#include <stdint.h>
#include <string>
#include <iostream>
enum class SimpleType {
ST_INVALID,
ST_INT64,
ST_UINT64,
ST_DOUBLE,
ST_STRING
};
template<SimpleType stype>
struct SimpleType2BuiltinType {
struct InvalidType {};
typedef InvalidType BuiltinType;
};
#define SimpleType2BuiltinTypeTraits(stype, btype) \
template<> \
struct SimpleType2BuiltinType<stype> { \
typedef btype BuiltinType; \
}
SimpleType2BuiltinTypeTraits(SimpleType::ST_INT64, int64_t);
SimpleType2BuiltinTypeTraits(SimpleType::ST_UINT64, uint64_t);
SimpleType2BuiltinTypeTraits(SimpleType::ST_DOUBLE, double);
SimpleType2BuiltinTypeTraits(SimpleType::ST_STRING, std::string);
#undef SimpleType2BuiltinTypeTraits
class Object {
public:
Object(SimpleType stype)
: type_(stype) {}
~Object() {}
public:
virtual SimpleType type() const {
return type_;
}
virtual void type(SimpleType stype) {
type_ = stype;
}
private:
SimpleType type_;
};
template<class T>
class BasicType : public Object {
public:
BasicType(SimpleType stype)
: Object(stype) {}
~BasicType() {}
public:
virtual void value(const T& value) {
value_ = value;
}
virtual const T& value() const {
return value_;
}
private:
T value_;
};
typedef BasicType<int64_t> Int64;
typedef BasicType<uint64_t> UInt64;
typedef BasicType<double> Double;
typedef BasicType<std::string> String;
#define SIMPLE_VALUE_HELPER(stype, obj) \
case stype: { \
typedef SimpleType2BuiltinType<stype>::BuiltinType Type; \
BasicType<Type>* typed = static_cast<BasicType<Type>*>(obj); \
const Type& v = typed->value(); \
std::cout << v << std::endl; \
break; \
}
#define SIMPLE_TYPE_MACRO_HEPLER(MY_MACRO, obj) \
MY_MACRO(SimpleType::ST_INT64, obj) \
MY_MACRO(SimpleType::ST_UINT64, obj) \
MY_MACRO(SimpleType::ST_DOUBLE, obj) \
MY_MACRO(SimpleType::ST_STRING, obj)
int main(int argc, char *argv[]) {
std::string v("foo");
String foo(SimpleType::ST_STRING);
foo.value(v);
Object* object = &foo;
switch (object->type()) {
SIMPLE_TYPE_MACRO_HEPLER(SIMPLE_VALUE_HELPER, object);
default:
break;
}
return 0;
}
- 通过Chocolatey软件包管理器安装.NET Core
- rsync同步时,删除目标目录比源目录多余文件的方法(--delete)
- 近期一枚“大文娱”dawenyu.com域名以小六位价格易主
- 分布式监控系统Zabbix-3.0.3-完整安装记录(0)
- URL安全的Base64编码
- 温故而知新:设计模式之原型模式(Prototype)
- Windows 7上执行Cake 报错原因是Powershell 版本问题
- 温故而知新:类索引器
- Visual Studio Code 代理设置
- 温故而知新:设计模式之工厂模式(Factory)
- 通过Jexus 部署 dotnetcore版本MusicStore 示例程序
- jquery.mobile手机网页简要
- 跟张志东深聊腾讯的“进化力”
- 详解微信小程序如何实现流程进度功能
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 程序猿怎么利用技术挣钱?——python量化实践
- 利用WireGuard建立IPv6隧道
- selenium爬虫相关报错解决
- 小涴熊漫画CMS:非常不错的免费开源的漫画连载系统,带采集API
- 成都电信宽带获取IPV6地址全过程
- android studio 3.6.1导入项目报错提示无法下载classpath里的内容
- Linux VPS使用命令行快速查询百度网盘提取码
- Flutter 首页必用组件NestedScrollView的示例详解
- AUXPI:简单的API图床程序,支持上传到搜狗/新浪/SMMS等多个图床
- android使用TextView实现跑马灯效果
- Android 自定义 View 中使用 Spannable的实例详解
- Android实现扫描和生成二维码
- android自定义弹出框样式的实现方法
- Android实现手绘功能
- Android 实现秒转换成时分秒的方法