【发布时间】:2017-07-13 13:27:57
【问题描述】:
我想要一个非常友好的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();
}
第二部分语法错误,如何用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;
}
第二部分c++11语法也错了,怎么实现?
【问题讨论】:
-
模板仅在编译时。您不能将运行时变量用作模板参数。为了解决这个问题,我建议你有一个带有参数包的辅助函数,然后你 unpack the tuple 调用该辅助函数。
-
在模板元编程中,迭代通常使用递归来完成。
-
我不擅长 c++ 模板,所以我不确定如何准确地编写代码...你能给我看代码吗?
-
你可以使用
std::index_sequence -
这在 C++14 中变得更容易,在 C++17 中更容易。
标签: c++ c++11 templates stdtuple