您的位置:首页 > 编程语言 > C语言/C++

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__ 扩展宏在有逗号的情况必须加上前缀##来匹配空的变长宏参数,否则宏展开后将因为存在多余的逗号而导致编译报错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: