stl模板庫成員函數重載類型混肴編譯不通過解決方法
這種方式編譯不通過IsArithmetic和HasMemberList編譯器存在混肴
template <typename T, typename Enable = std::enable_if<IsArithmetic<T>::value>::type >static void DumpWrapper(T* filed, std::string fieldname){printf("fieldname:=>%s\r\n", fieldname.c_str());enum : std::size_t { IntValSize = sizeof(T) };if (IntValSize > 4){printf("%s:=>%016llx\r\n", fieldname.c_str(), *filed);}else{printf("%s:=>%08x\r\n", fieldname.c_str(), *filed);}}template <typename T, typename Enable = std::enable_if<IsArithmetic<T>::value >::type >static void DumpWrapper(T filed, std::string fieldname){printf("fieldname:=>%s\r\n", fieldname.c_str());enum : std::size_t { IntValSize = sizeof(T) };if (IntValSize > 4){printf("%s:=>%016llx\r\n", fieldname.c_str(), filed);}else{printf("%s:=>%08x\r\n", fieldname.c_str(), filed);}}template <typename T, typename Enable = EnableIfHasMemberList<T>>static void DumpWrapper(nop::S7PlusPacketValue<T>* filed, std::string fieldname){printf("fieldname:=>%s\r\n", fieldname.c_str());filed.Dump();}template <typename T, typename Enable = EnableIfHasMemberList<T>>static void DumpWrapper(nop::S7PlusPacketValue<T> filed, std::string fieldname){printf("fieldname:=>%s\r\n", fieldname.c_str());filed->Dump();}
解決方法必須明確重載IsArithmetic和HasMemberList編譯器存在混肴,加上雙重判斷typename Enable = std::enable_if<IsArithmetic::value&!HasMemberList::value>::type來明確混肴條件,這種方式編譯通過
template <typename T, typename Enable = std::enable_if<IsArithmetic<T>::value&!HasMemberList<T>::value>::type >static void DumpWrapper(T* filed, std::string fieldname){printf("fieldname:=>%s\r\n", fieldname.c_str());enum : std::size_t { IntValSize = sizeof(T) };if (IntValSize > 4){printf("%s:=>%016llx\r\n", fieldname.c_str(), *filed);}else{printf("%s:=>%08x\r\n", fieldname.c_str(), *filed);}}template <typename T, typename Enable = std::enable_if<IsArithmetic<T>::value & !HasMemberList<T>::value>::type >static void DumpWrapper(T filed, std::string fieldname){printf("fieldname:=>%s\r\n", fieldname.c_str());enum : std::size_t { IntValSize = sizeof(T) };if (IntValSize > 4){printf("%s:=>%016llx\r\n", fieldname.c_str(), filed);}else{printf("%s:=>%08x\r\n", fieldname.c_str(), filed);}}template <typename T, typename Enable = EnableIfHasMemberList<T>>static void DumpWrapper(nop::S7PlusPacketValue<T>* filed, std::string fieldname){printf("fieldname:=>%s\r\n", fieldname.c_str());filed.Dump();}template <typename T, typename Enable = EnableIfHasMemberList<T>>static void DumpWrapper(nop::S7PlusPacketValue<T> filed, std::string fieldname){printf("fieldname:=>%s\r\n", fieldname.c_str());filed->Dump();}