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-03-14 20:17:57 发布