如何在不破坏现有C++代码功能的前提下修改类成员的typedef类型
解决方案
方案1:最小成本增量扩展原类(首推)
这是改动最小、完全不影响旧代码的方案,只需要修改mal::FrameAudio的类定义和实现文件,外部代码无需做任何调整:
- 保留原有所有接口和类型定义完全不动,新增float版本的类型别名和对应方法:
class FrameAudio { public: // 原有定义完全保留,不做任何修改 typedef Eigen::Matrix<unsigned char, Eigen::Dynamic, Eigen::Dynamic> pluginType; const pluginType& getPlug() const; void setPlug(const pluginType& plugin); // 新增float版本的定义 typedef Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> pluginFloatType; const pluginFloatType& getPlugFloat() const; void setPlugFloat(const pluginFloatType& plugin); private: // 原有成员变量不动,新增float类型的存储成员 pluginType m_plugin; pluginFloatType m_pluginFloat; ... };
- 按需实现两种类型的互转逻辑(可选):如果你的场景里同一个音频帧的插件数据需要在两种格式间转换,可以在get/set方法里加自动转换逻辑,比如调用
getPlugFloat()时如果只有uchar格式的数据,自动转成float返回,不需要上层业务感知。
方案2:模板重载版本(适合不想新增方法名的场景)
如果你希望保持getPlug/setPlug的方法名不变,可以给原类加模板化的重载方法,同样不需要修改任何旧代码:
class FrameAudio { public: // 原有定义完全保留 typedef Eigen::Matrix<unsigned char, Eigen::Dynamic, Eigen::Dynamic> pluginType; const pluginType& getPlug() const; void setPlug(const pluginType& plugin); // 新增模板化的get/set重载 template<typename T> using PluginType = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>; template<typename T, typename = std::enable_if_t<std::is_same_v<T, float>>> const PluginType<T>& getPlug() const; template<typename T, typename = std::enable_if_t<std::is_same_v<T, float>>> void setPlug(const PluginType<T>& plugin); ... };
原有代码调用无模板参数的getPlug()依然会匹配旧的uchar版本,完全不受影响;你自己的业务代码可以通过getPlug<float>()获取float类型的插件数据。
相关疑问解答
- 你之前评估的继承和全局模板化方案的问题都是正确的:继承无法处理不同返回值类型的非虚函数重写,还会有对象切片的风险;全局改模板类需要修改所有引用
FrameAudio的业务代码,改造成本过高不适合大型项目。 - 不能用
auto做typedef:auto是用于运行时变量的类型推导,无法用来定义类型别名,C++的类型别名只能用typedef或者using定义。
内容的提问来源于stack exchange,提问作者Oroshimaru
相关产品推荐
相关产品推荐

