如何避免模板特化中因类型转换差异导致的重复代码?
避免模板特化重复代码的方案
完全不用为不同类型重复特化exec方法,核心思路是把类型转换逻辑从exec中抽离出来,让模板的通用版本能适配所有需要的类型。
具体实现步骤
提取类型转换的辅助函数
写一个模板转换函数,针对不同的T类型实现对应的转换规则,而不是去特化整个exec:// 通用转换逻辑,默认用reinterpret_cast template<typename T> uint32_t* convert_to_uint32_ptr(T mem) { return reinterpret_cast<uint32_t*>(mem); } // 针对D类型的转换特化,使用static_cast template<> uint32_t* convert_to_uint32_ptr<D>(D mem) { return static_cast<uint32_t*>(mem); }修改C类的通用
exec方法
让exec调用这个转换函数,这样就不需要再为不同类型特化exec了:template <typename T> class C { public: C(T mem) : m_mem(mem) {} T m_mem; void exec(); }; // 通用的exec实现,无需特化 template<typename T> void C<T>::exec() { cout << "exec = " << *convert_to_uint32_ptr(m_mem) << endl; }
完整可运行代码
#include <iostream> using namespace std; class D { public: D(uint8_t* mem) : m_mem(mem) {} uint8_t* m_mem; operator uint32_t*() { return reinterpret_cast<uint32_t*>(m_mem); } }; // 通用转换模板 template<typename T> uint32_t* convert_to_uint32_ptr(T mem) { return reinterpret_cast<uint32_t*>(mem); } // D类型的转换特化 template<> uint32_t* convert_to_uint32_ptr<D>(D mem) { return static_cast<uint32_t*>(mem); } template <typename T> class C { public: C(T mem) : m_mem(mem) {} T m_mem; void exec(); }; // 通用的exec实现,无需特化 template<typename T> void C<T>::exec() { cout << "exec = " << *convert_to_uint32_ptr(m_mem) << endl; } int main() { uint8_t mem[4] = {0,1,2,3}; C<uint8_t*> c1(mem); C<D> c2(mem); c1.exec(); c2.exec(); return EXIT_SUCCESS; }
额外说明
这种方式把变化的转换逻辑和**不变的业务逻辑(exec里的输出操作)**做了分离。后续如果新增其他需要不同转换规则的类型,只需要新增转换函数的特化即可,不用再修改C类的exec方法,彻底避免了大量重复代码的问题。
内容的提问来源于stack exchange,提问作者bitmap kid
相关产品推荐
相关产品推荐

