lin*_*bin 2 c++ templates c++11 stdtuple
我想要一个非常友好的ToString功能,包括许多类型std::tuple.功能是这样的:
template <typename T>
inline std::string ToString(const T &t) {
std::stringstream ss;
ss << t;
return ss.str();
}
template <typename... Args>
inline std::string ToString(const std::tuple<Args...> &t) {
std::stringstream ss;
for (int i = 0; i < t.size(); i++) {
ss << ToString(std::get<i>(t)) << " ";
}
return ss.str();
}
Run Code Online (Sandbox Code Playgroud)
第二部分是语法错误,如何用c ++ 11模板实现它?
而且,如何实现FromString这样的:
template <typename T>
inline T FromString(const std::string &s) {
std::stringstream ss(s);
T t;
ss >> t;
return t;
}
template <typname... Args>
inline std::tuple<Args...> FromString(const std::string &s) {
std::tuple<Args...> ret;
ret.resize(sizeof...Args);
std::stringstream ss;
size_t pos;
for (int i = 0, prev_pos = 0; i < sizeof...Args and prev_pos < s.length(); i++) {
pos = s.find(" ", prev_pos);
T t = FromString(s.substr(prev_pos, pos));
std::get<i>(ret) = t;
prev_pos = pos
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
关于c ++ 11语法的第二部分也是错误的,如何实现呢?
在C++ 17中,您可以:
template <typename ... Ts>
std::string ToString(const Ts& ... ts) {
std::stringstream ss;
const char* sep = "";
((static_cast<void>(ss << sep << ts), sep = " "), ...);
return ss.str();
}
template <typename... Args>
std::string ToString(const std::tuple<Args...> &t) {
return std::apply([](const auto&... ts) { return ToString(ts...); }, t);
}
Run Code Online (Sandbox Code Playgroud)