c ++ 11如何实现`std :: string ToString(std :: tuple< Args ...>& t)`? [英] c++11 how to implement `std::string ToString(std::tuple<Args...> &t)`?
本文介绍了c ++ 11如何实现`std :: string ToString(std :: tuple< Args ...>& t)`?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想为许多类型提供非常友好的ToString
函数,包括std::tuple
.函数是这样的:
I want a very friendly ToString
function for many types, include the std::tuple
. The function is like this:
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();
}
第二部分语法错误,如何使用c ++ 11模板实现它?
The second part is wrong on grammar, how to implement it with c++11 template ?
而且,如何像这样实现FromString
:
And, how to implement the FromString
like this:
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;
}
第二部分在c ++ 11语法上也是错误的,如何实现?
The second part is also wrong on c++11 grammar, how to implement it ?
推荐答案
在C ++ 17中,您可以这样做:
In C++17, you may do:
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);
}
这篇关于c ++ 11如何实现`std :: string ToString(std :: tuple< Args ...>& t)`?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文