2

我想这样做:

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

感谢您的回答,我决定根据您告诉我的内容重新编写这个问题,因为它变得有点混乱。最终,我阅读了C++ 格式的宏/内联 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 回答 4

4

重新设计您的解决方案。如果您的 c-tor 需要字符串,它应该接受字符串。
如果您的构造函数接受 const 引用,那么在这种情况和类似情况下也会更好。

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

发生错误是因为 operator<< 定义并返回 std::basic_ostream 而不是 std::stringstream 对象。当然你可以使用

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

但是你的团队负责人可能会因为这段代码解雇你:)

顺便提一句:

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

可以重写为

MyClass mc("Some string" << anotherString);
于 2009-03-19T23:23:54.463 回答
2

您的编译错误看起来像已包含

<iosfwd> 

在你班级的头文件中,但你没有包括

<sstream> 

在 cxx 文件中。

于 2009-03-19T22:38:46.227 回答
1

我认为您应该查看这个问题以获取有关获得所需行为所需的一些提示。

这种事情似乎有点困难。

于 2009-03-19T22:50:11.987 回答
1

<< 运算符返回 ostream &,而不是 streamstream &,因此您必须进行动态转换:

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;
}
于 2009-03-19T22:50:23.513 回答