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