C++11下如何将遗留Wrapper类转换为模板类且兼容原有代码调用
兼容遗留代码的类型安全Wrapper模板类转换方案
你遇到的问题是要把原有的非类型安全Wrapper类升级为模板类,同时不改动任何已有的使用代码,这在C++11里完全可以做到,下面给你两种实用的方案:
方案一:模板特化实现兼容
这个方法是把原有的Wrapper行为作为模板类的void*特化版本,既保留遗留代码的兼容性,又能让新代码使用类型安全的模板版本:
// 先声明模板类 template<class T> class Wrapper; // 定义通用类型安全的模板类(供新代码使用) template<class T> class Wrapper { public: Wrapper(T val) : m_value(val) {} T get() { return m_value; } private: T m_value; }; // 特化void*版本,完全匹配原有遗留类的行为(供旧代码使用) template<> class Wrapper<void*> { public: Wrapper(void* val) : m_value(val) {} void* get() { return m_value; } private: void* m_value; };
这样一来,旧代码里的Wrapper w(some_void_ptr);和void* ptr = w.get();完全不需要修改,编译器会自动匹配到Wrapper<void*>的特化版本;而新代码可以直接用Wrapper<int> w(42);或者Wrapper<std::string> w("hello");来获得类型安全的封装。
方案二:别名模板+重命名模板类
如果不想用特化,也可以先给模板类起一个临时名字,再用C++11推荐的using(或传统typedef)把原Wrapper名映射到模板的void*实例:
// 定义类型安全的模板类,用新名字 template<class T> class TemplateWrapper { public: TemplateWrapper(T val) : m_value(val) {} T get() { return m_value; } private: T m_value; }; // 用using将原Wrapper名绑定到TemplateWrapper<void*>,兼容旧代码 using Wrapper = TemplateWrapper<void*>;
这个方案的好处是代码更直观,旧代码依然可以用Wrapper类,新代码则用TemplateWrapper<T>来实现类型安全,同样不需要修改任何遗留代码。
两种方案都完全符合C++11标准,不会有兼容性问题。
内容的提问来源于stack exchange,提问作者yannick818
相关产品推荐
相关产品推荐

