c ++ 11如何实现`std :: string ToString(std :: tuple <Args ...>&t)`?

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语法的第二部分也是错误的,如何实现呢?

Jar*_*d42 7

在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)

演示