我有以下功能
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}}超载,或允许我在一行中完成所需的行为。
答案 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
}