// // Copyright (c) 2017 XiaoMi All rights reserved. // #ifndef MACE_UTILS_STRING_UTIL_H_ #define MACE_UTILS_STRING_UTIL_H_ #include #include #include namespace mace { namespace string_util { inline void MakeStringInternal(std::stringstream & /*ss*/) {} template inline void MakeStringInternal(std::stringstream &ss, const T &t) { ss << t; } template inline void MakeStringInternal(std::stringstream &ss, const T &t, const Args &... args) { MakeStringInternal(ss, t); MakeStringInternal(ss, args...); } } // namespace string_util template std::string MakeString(const Args &... args) { std::stringstream ss; string_util::MakeStringInternal(ss, args...); return ss.str(); } template std::string MakeString(const std::vector &args) { std::stringstream ss; ss << "["; const size_t size = args.size(); for (int i = 0; i < size; ++i) { ss << args[i]; if (i < size - 1) { ss << ", "; } } ss << "]"; return ss.str(); } // Specializations for already-a-string types. template <> inline std::string MakeString(const std::string &str) { return str; } inline std::string MakeString(const char *c_str) { return std::string(c_str); } } // namespace mace #endif // MACE_UTILS_STRING_UTIL_H_