灵活组成字符串的简洁方法?

时间:2014-08-17 15:58:46

标签: c++

什么是灵活组成字符串的简洁方法?我不想使用宏。

例如,我可能想要将int转换为十六进制格式的字符串,填充为10个字符的宽度,连接到字符串,另一个数字,...

基本上,我想要ostringstream / printf的灵活性,但需要一行代码。

3 个答案:

答案 0 :(得分:6)

我之前使用过这样的东西:

#include <sstream>

class make_string
{
public:
    make_string() { }

    template <typename T>
    explicit make_string(T && rhs)
    {
        oss << rhs;
    }

    template <typename T>
    make_string &operator<<(T && rhs)
    {
        oss << rhs;
        return *this;
    }

    operator std::string() const
    {
        return oss.str();
    }

    std::string str() const
    {
        return oss.str();
    }

private:
    std::ostringstream oss;
};

用法是这样的:

string s = make_string() << "Hello, world" << '!' << 42 << 1.0;

或者像这样:

string s = make_string(4.0);

如果您愿意,它可以灵活地在一个表达式中流式传输多个对象,或者如果您需要,可以立即转换单个类型。它将隐式转换为std::string,因此您可以将其直接分配给一个T。它所需要的只是您的类型std::ostream具有boost::lexical_cast()对象的流插入运算符。

或者(如上面的评论者所建议的),如果您已在项目中使用Boost,那么{{1}}是另一个潜在的选择。你应该看看它的界面并选择你最喜欢的界面。

答案 1 :(得分:1)

您可以使用此实用程序功能:

// util.h
#include <string>
#include <sstream>

inline std::string to_str(basic_ostream<char>& str) {
    return dynamic_cast<std::ostringstream&>(str).str();
}

像这样使用它:

// Example.cpp
#include <stdexcept>
#include "util.h"

using namespace std;

void f(int address) {
  runtime_error(to_str(ostringstream() << "Did not find instruction at: " << hex << address)));
}

答案 2 :(得分:1)

另一种方法:

template <typename T>
std::string to_str(T&& t)
{
   std::ostringstream out;
   out << t;
   return out.str();
}