2016-03-20 19 views
1

Ich habe folgende FunktionenFütterung std :: string und gleichzeitig als Argument an eine Funktion c vorbei ++

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

wo instructions ist eine Liste von Strings. Ich möchte etwas tun wie

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

aber ich erhalte eine Fehlermeldung von dem Compiler

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

Ich habe versucht, die Definition von push_back Ändern std::basic_ostream<char> zu nehmen, aber es immer noch nicht kompilieren.

Grundsätzlich, was ich tun möchte, ist in der Lage, push_back eine Zeichenfolge, die die Ausrichtung hat, die fügt. Es ist auch wichtig, dass ich bin in der Lage Assembly::push_back in einer einzigen Zeile zu nennen (ich weiß, dass

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

funktioniert, aber es zwei Zeilen Code erfordert den richtigen Anruf zu tätigen). Ich bin auch offen für Lösungen, die die operator<< für Assembly überlasten oder erlauben mir, das erforderliche Verhalten in einer einzigen Zeile zu erreichen.

+0

Warum nicht einige einfache "Instruction" -Klasse, die die Formatierung tun, und hat verschiedene Konstruktoren (oder möglicherweise Unterklassen), um mit den notwendigen Kombinationen von Parametern umzugehen? –

+0

Warum ist es so wichtig, dass der Push-back-Anruf in einer Zeile steht? –

+0

Ja, eine separate Klasse zu erstellen wird funktionieren, ich frage mich nur, ob ich das mit der Standardbibliothek machen kann. – niko

Antwort

1

Machen Sie Ihre pad() nehmen und geben einen std::stringstream, und dann wird diese auch hinzufügen:

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

Hier ist, was ich denke, das Problem ist. Dies funktioniert nicht, da der Rückgabewert ss << anything immer ein std::ostream& ist, der ein Elternteil von std::stringstream ist und das Argument für Ihre push_back() Funktion nicht erfüllt.

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 
} 

Die Art und Weise, dies zu beheben, ist eine Überlastung für operator<<(std::stringstream& zu erstellen, die den richtigen Typ zurückgibt:

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

Jetzt << auf einem std::stringstream Aufruf wird eine std::stringstream& zurück, die als push_back() Parameter akzeptabel ist.