Могу ли я передать строки C ++ в метод в стиле потока? - PullRequest
2 голосов
/ 20 марта 2009

Я бы хотел сделать это:

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

Спасибо за ваши ответы, я решил переписать этот вопрос, основываясь на том, что вы мне сказали, потому что он немного запутался. В конце концов, я прочитал макрос C ++ формата / inline ostringstream и решил использовать макрос, так как в действительности это невозможно сделать с помощью конструктора. Некоторые ответы мои больше не актуальны.

Теперь, что я могу сделать, это:

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

Использование этого макроса:

#include <sstream>

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

Где конструктор MyClass принимает строку:

MyClass::MyClass(string s) { /* ... */ }

Ответы [ 4 ]

4 голосов
/ 20 марта 2009

редизайн вашего решения. если ваш c-tor нуждается в строке, он должен принимать строку.
также в этом и подобных случаях будет лучше, если ваш конструктор примет ссылку на const.

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

ошибка произошла, потому что оператор << определен для и возвращает std :: basic_ostream, а не std :: stringstream объект. Конечно, вы могли бы использовать </p>

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

но ваша команда может уволить вас за этот код:)

Кстати:

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

может быть переписано как

MyClass mc("Some string" << anotherString);
2 голосов
/ 20 марта 2009

Ваша ошибка компиляции выглядит как включенная

<iosfwd> 

в заголовочном файле вашего класса, но вы не включили

<sstream> 

в файле cxx.

1 голос
/ 20 марта 2009

Оператор << возвращает ostream &, а не streamstream &, поэтому вам придется выполнить динамическое приведение: </p>

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

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

Но на самом деле это ужасная вещь. Попробуйте что-то вроде этого:

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;
}
1 голос
/ 20 марта 2009

Я думаю, вам следует взглянуть на этот вопрос, чтобы найти подсказки о том, что потребуется для получения желаемого поведения.

Подобные вещи кажутся немного сложными.

...