Pregunta

Me gustaría hacer esto:

MyClass mc = MyClass("Some string" << anotherString);

Gracias por sus respuestas, he decidido volver a escribir esta pregunta en base a lo que me has dicho, ya que se ha vuelto un poco desordenado. Con el tiempo, leí C ++ formato de macro / línea ostringstream , y decidió utilizar una macro, ya que en realidad no es posible hacer esto usando un constructor. Algunas respuestas a mi ya no sea relevante.

Ahora, lo que yo puedo realidad, hacerlo es:

MY_CLASS("Some string" << anotherString << " more string!");

El uso de este macro:

#include <sstream>

#define MY_CLASS(stream) \
MyClass( ( dynamic_cast<std::ostringstream &> ( \
    std::ostringstream() . seekp( 0, std::ios_base::cur ) << stream ) \
) . str() )

Cuando el constructor MiClase toma una cadena:

MyClass::MyClass(string s) { /* ... */ }
¿Fue útil?

Solución

Creo que usted debe buscar en esta pregunta para algunas pistas sobre lo que será requerido para obtener el comportamiento que desea.

Este tipo de cosas parece un poco difícil.

Otros consejos

rediseñar su solución. si su c-tor necesita cadena de caracteres que debe aceptar cadena.
También en este y otros casos será mejor si su constructor aceptará referencia constante.

no matching function for call to ‘MyClass(std::basic_ostream <..>&)

pasó error porque el operador << definido para y devuelve std :: basic_ostream no std :: objeto stringstream. por supuesto que podría utilizar

dynamic_cast< const std::stringstream& >( s << "hello" << "world" )

pero el líder del equipo que pudiera disparar para este código:)

BTW:

MyClass mc = MyClass("Some string" << anotherString);

podría ser regrabadas como

MyClass mc("Some string" << anotherString);

Su error de compilación se parece haber incluido

<iosfwd> 

en el archivo de cabecera de su clase, pero no se ha incluido

<sstream> 

en el archivo CXX.

El operador << devuelve un ostream y, no un streamstream y, por lo que tendría que hacer un reparto dinámica:

MyClass::MyClass(ostream &stream)
{
    string myString = dynamic_cast<stringstream &>(stream.str());
}

stringstream s;
MyClass *mc = new MyClass(s << "Some string" << anotherString);

Pero en realidad eso es una cosa terrible a hacer. Intentar algo como esto:

class Streamer
{
stringstream stream;
public:
    template <class T>
    Streamer &operator <<(const T &object) { stream << object; return *this;}
    operator string() { return stream.str(); }
};    

class MyClass
{
public:
    MyClass(const string &s) : MyString(s) {}
    string MyString;
};

int main()
{
    MyClass myClass(Streamer() << "something" << "world");
    cout << myClass.MyString;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top