提供给std :: stringstream并同时将其作为参数传递给函数c ++

时间:2016-03-20 16:58:00

标签: c++ string stringstream ostream temporary

我有以下功能

void Assembly::push_back(stringstream& ss){
    instructions->push_back(ss.str());
}

std::ostream& pad(std::ostream& os) {
    return os <<"\t"<<std::left<< std::setfill(' ') << std::setw(8);
}

其中instructions是字符串列表。我想做某事......

Assembly outfile;
stringstream ss;
outfile.push_back(ss<<pad<<"addiu"<<"$sp, $sp, -8");

但是我从编译器中得到错误

no known conversion for argument 1 from 'std::basic_ostream<char>' to 'std::stringstream& {aka std::basic_stringstream<char>&}'

我尝试将push_back的定义更改为std::basic_ostream<char>,但仍然无法编译。

基本上我想做的是能够push_back一个具有pad添加对齐的字符串。我能够在一行中呼叫Assembly::push_back也很重要(我知道

Assembly outfile;
stringstream ss;
ss<<pad<<"addiu"<<"$sp, $sp, -8";
outfile.push_back(ss);

有效,但需要两行代码才能进行正确的调用。我也对解决方案持开放态度,使operator<<的{​​{1}}超载,或允许我在一行中完成所需的行为。

2 个答案:

答案 0 :(得分:1)

让你pad()拍摄并返回std::stringstream,然后再加上:

template <typename T>
std::stringstream &
operator<<(std::stringstream &ss, const T &o) {
    static_cast<std::ostream &>(ss) << o; // Prevent recursion.
    return ss;
}

答案 1 :(得分:0)

以下是我认为问题所在。这不会起作用,因为ss << anything的返回值始终是std::ostream&,它是std::stringstream的父级,并且不满足push_back()函数的参数。

void push_back(const std::stringstream& ss)
{
    std::cout << "push: " << ss.str() << '\n';
}

int main(int, char* argv[])
{
    std::stringstream ss;

    // what gets sent to the function is an std::ostream&
    // which is an incompatible type.
    push_back(ss << "one " << 2 << ' ' << 3.0); // fail
}

解决此问题的方法是为operator<<(std::stringstream&创建一个返回正确类型的重载:

template<typename DataType>
std::stringstream& operator<<(std::stringstream& ss, const DataType& data)
{
    static_cast<std::ostream&>(ss) << data;
    return ss;
}

现在在<<上调用std::stringstream将返回std::stringstream&,这可以作为push_back()参数接受。

void push_back(const std::stringstream& ss)
{
    std::cout << "push: " << ss.str() << '\n';
}

int main(int, char* argv[])
{
    std::stringstream ss;

    // Now the << returns the correct type (std::stringstream&)
    push_back(ss << "one " << 2 << ' ' << 3.0); // good
}