c ++ 11如何实现`std :: string ToString(std :: tuple< Args ...>& t)`? [英] c++11 how to implement `std::string ToString(std::tuple<Args...> &t)`?

查看:230
本文介绍了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&lt; Args ...&gt;&amp; t)`?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆