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++ 11 可变参数宏结合可变参数模板使用!
最新推荐文章于 2025-09-08 21:51:14 发布
本文介绍了一种使用模板元编程实现的类型注册机制。通过定义通用的register_t结构体,可以为不同的类型创建注册实例,并利用C++11的变长模板参数包特性支持构造时传递额外参数。该机制简化了工厂模式下对象的创建过程。
1158





