C++ 11 可变参数宏结合可变参数模板使用!
2016-01-04 12:38
696 查看
template<typename T> struct register_t { register_t(const std::string& key) { map_.emplace(key, [] { return new T(); }); } template<typename... Args> register_t(const std::string& key, Args... args) { map_.emplace(key, new_object(args...)); } private: T* new_object() { new T(); } template<typename... Args> T* new_object(Args... args) { new T(args...); } std::map<std:string, T*> map_; }; #define REGISTER_MESSAGE_VNAME(T) reg_msg_##T##_ #define REGISTER_MESSAGE(T, key, ...) static factory::register_t<T> REGISTER_MESSAGE_VNAME(T)(key, ##__VA_ARGS__); 注意: __VA_ARGS__ 扩展宏在有逗号的情况必须加上前缀##来匹配空的变长宏参数,否则宏展开后将因为存在多余的逗号而导致编译报错。
相关文章推荐
- C++ string 用法詳解
- c++静态成员变量的使用
- 分享C++寫blueprint block的方法
- 两条未知曲线,求其最短距离
- 介绍Unreal Engine 4中的接口(Interface)使用C++和蓝图
- c++中this指针的用法小结
- 将那些对称的字符串按从小到大的顺序输 出。字符串先以长度论大小,如果长度相同,再以 ASCII 码值为排序标准。
- 将 01 串首先按长度排序,长度相同时,按 1 的个数多少进行排序, 1 的个数相同时再 按 ASCII 码值排序。
- C++ Primer Plus第六版-第八章学习笔记
- C++ 中list的使用说明
- C++跨平台类型定义
- C++常用预定义
- C语言制造一个随机数
- c++ primer 学习笔记18 关联容器
- STL编程题1(C++程序设计第8周)
- Effective C++ Item 33 避免遮掩继承过来的名称
- C语言union(联合体 共用体)
- C语言.答辩总结
- c++中的iostream
- 关于fflush(stdin)清空输入缓存流(C/C++)