C++;单行字符串生成器类 强> >: C++代码的一行,我想流串并将流内容分配给字符串变量: int i = 1; double d = 3.2; std::string str = StringBuilder() << "i=" << i << " and d=" << d; inti=1; 双d=3.2; std::string str=StringBuilder()

C++;单行字符串生成器类 强> >: C++代码的一行,我想流串并将流内容分配给字符串变量: int i = 1; double d = 3.2; std::string str = StringBuilder() << "i=" << i << " and d=" << d; inti=1; 双d=3.2; std::string str=StringBuilder(),c++,C++,您不需要自定义的StringBuilder类,STL已经有了自己的内置类-。在1-liner中使用它有点棘手,但可以做到: #include <string> #include <sstream> int i = 1; double d = 3.2; std::string str = static_cast<std::ostringstream&>(std::ostringstream() << "i=" << i

您不需要自定义的
StringBuilder
类,STL已经有了自己的内置类-。在1-liner中使用它有点棘手,但可以做到:

#include <string>
#include <sstream>

int    i = 1;
double d = 3.2;

std::string str = static_cast<std::ostringstream&>(std::ostringstream() << "i=" << i << " and d=" << d).str();


但是,为了便于讨论,假设您确实想要创建一个自定义的
StringBuilder
类。它只需要实现
操作符您不需要自定义
StringBuilder
类,STL已经有了自己的内置类-。在1-liner中使用它有点棘手,但可以做到:

#include <string>
#include <sstream>

int    i = 1;
double d = 3.2;

std::string str = static_cast<std::ostringstream&>(std::ostringstream() << "i=" << i << " and d=" << d).str();


但是,为了便于讨论,假设您确实想要创建一个自定义的
StringBuilder
类。它只需要实现
操作符,这里有一种替代方法:生成一个函数

namespace impl
{
    std::stringstream ss;
    const std::stringstream::fmtflags stdfmt = ss.flags();
}

template <typename ...P> std::string make_str(const P &... params)
{
    impl::ss.clear();
    impl::ss.str("");
    impl::ss.flags(impl::stdfmt);
    (impl::ss << ... << params);
    return impl::ss.str();
}

这里有一种替代方法:生成一个函数

namespace impl
{
    std::stringstream ss;
    const std::stringstream::fmtflags stdfmt = ss.flags();
}

template <typename ...P> std::string make_str(const P &... params)
{
    impl::ss.clear();
    impl::ss.str("");
    impl::ss.flags(impl::stdfmt);
    (impl::ss << ... << params);
    return impl::ss.str();
}

是,提示请参见:
std::string\u stream
您只需要提供
StringBuilder::operator“这可以做到吗?”-是。“StringBuilder类的实现情况如何?”-这由您自己决定。“如何扩展std::string以接受StringBuilder的分配?”-您可以添加模板专业化。“实用吗?”-我不明白为什么不行。未来请每个SO问题坚持一个问题。是的,提示请参见:
std::string\u stream
您只需要提供
StringBuilder::operator“这可以做到吗?”-是的。“StringBuilder类的实现情况如何?”-这由您自己决定。“如何扩展std::string以接受StringBuilder的分配?”-您可以添加模板专业化。“实用吗?”-我不明白为什么不行。未来请坚持每个SO问题一个问题。好的,这适用于简单的设置。不幸的是,对于完整的功能,您需要添加一些
operator@bolov:是的,您需要类似于
StringBuilder&operatorwell的东西。这适用于简单的设置。不幸的是,对于完整的功能,您需要添加一些
operator@bolov:是的,您需要类似于
StringBuilder&operator的东西如果您这样做,请注意,如果您这样做的话,您可以更有效地执行此操作(至少对于内置类型或标准类型而言)(可以避免一些分配),请注意,以更有效的方式(可以避免某些分配)执行此操作(至少对于内置类型或标准类型)
namespace impl
{
    std::stringstream ss;
    const std::stringstream::fmtflags stdfmt = ss.flags();
}

template <typename ...P> std::string make_str(const P &... params)
{
    impl::ss.clear();
    impl::ss.str("");
    impl::ss.flags(impl::stdfmt);
    (impl::ss << ... << params);
    return impl::ss.str();
}
int    i = 1;
double d = 3.2;

std::string str = make_str("i=", i, " and d=", d);