C++ 11 可变参数宏结合可变参数模板使用!

来源:互联网 发布:sdrsharp软件使用教程 编辑:程序博客网 时间:2024/06/13 06:59
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__ 扩展宏在有逗号的情况必须加上前缀##来匹配空的变长宏参数,否则宏展开后将因为存在多余的逗号而导致编译报错。


0 0
原创粉丝点击