如何解决MSVC中模板强类型定义的C4244数据丢失转换警告?
强类型转换的MSVC警告问题与解决方案
问题场景
BOOST_STRONG_TYPEDEF(int, MyInt) template<typename T_Int> T_Int myFunc(long long v) { return (T_Int)v; } myFunc<MyInt>(1); // <= 此处触发MSVC的*C4244*警告 myFunc<int>(1);
该警告仅在MSVC中出现,即使开启g++ -Wall编译也不会触发。
虽然可以直接用(T_Int)(int)v这类写法规避,但在模板代码里的最佳实践是什么?
解决方案1:自定义类型特质映射
通过特化类型特质类,为强类型指定对应的原始类型,在转换时先转成原始类型再构造强类型:
template<typename T> class Orig { public: typedef T Type; }; template<> class Orig<MyInt> { public: typedef int Type; }; // 修改后的模板函数 template<typename T_Int> T_Int myFunc(long long v) { return (typename Orig<T_Int>::Type)v; }
解决方案2:增强强类型的构造函数
直接在自定义强类型中添加模板构造函数,在构造内部完成安全转换,避免外部转换时的警告:
class MyInt { public: MyInt(); MyInt(const MyInt &); MyInt(const int &); // 关键代码:模板构造函数内完成数值转换 template<typename T> explicit MyInt(const T &v) : v((int)v) {} private: int v; };
内容的提问来源于stack exchange,提问作者ZSaberLv0
相关产品推荐
相关产品推荐

