3

我有以下宏。

#define STRING_STREAM( data )       \
    ( ( (std::ostringstream&)       \
        ( std::ostringstream( ).seekp( 0, std::ios_base::cur ) << data ) ).str( ) )

我正在尝试为枚举重载 <<:

std::ostringstream& operator<<( std::ostringstream& oStrStream, TestEnum& testEnum )
{
    oStrStream << "TestEnum";
    return oStrStream;
}

当我调用 STRING_STREAM(testEnum) 时,它不使用重载的 <<。它打印枚举数值。

4

2 回答 2

2
std::ostream& operator<<( std::ostream& oStrStream, const TestEnum testEnum )
{
    oStrStream << "TestEnum";
    return oStrStream;
}
于 2012-05-20T04:55:07.393 回答
0

问题是重载的 << 运算符期望一个参数为..

new ostringstream() 

但你给它的论点..

ostringstream()

这与重载函数匹配。

在我的示例中,我使用 auto_ptr 在超出范围后自动释放 ostringstream。这允许我们使用宏来执行我们的功能而不会发生内存泄漏。

#include<sstream>
#include<iostream>
#define STRING_STREAM( data )                                                  \
   ((ostringstream&)( *( auto_ptr<ostringstream>(new ostringstream()) ) << data)).str()

using namespace std;

enum TestEnum { ALPHA, BETA };

ostringstream& operator<<( ostringstream& oss, TestEnum testEnum ){
    oss << "TestEnum";
    return oss;
}
int main(){
    cout << STRING_STREAM( ALPHA ) << endl;
}
于 2012-05-19T05:08:50.433 回答