1

C++形式マクロ/インラインostringstreamの参照

そこで問題となったのは、オブジェクトをインライン連結して文字列を iostream スタイルで作成できるようにするマクロでした。

答えは次のとおりです。

#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
        ( std::ostringstream().seekp( 0, std::ios_base::cur ) << x ) \
    ).str()

使用法 (例):

throw std::runtime_error(
        SSTR( "FooBar error: Value " << x << " exceeds " << y )
);

それは美しく機能します-GCCを使用します。Visual C++ 2005 でもコンパイルおよび実行されます。しかし、後者では、マクロを使用するとすべて空の文字列が返され、その理由と修正方法について非常に唖然とします...?

4

1 に答える 1

2

残念ながら、テストする MSVC コンパイラにアクセスできません。

Microsoft のツールに関する私の過去の経験では、Microsoft は言語の定義と標準を大まかなガイドとして扱っているように思えます。(私は、Microsoft が C99 のような基本的なもので伝統を破ったことを発見するためだけに、プロジェクトに多くの時間を費やしました。)

この残念な状況を考えると、一連の簡単なプログラムを試してみることをお勧めします。次のようなもの:

std::ostringstream() o;
o.seekp( 0, std::ios_base::cur ) << "foo";
cout << "Test1:  " << o << endl;

多分:

std::ostringstream() o;
cout << "Test2:  " << typeid(o).name() << endl;
cout << "Test3:  " << typeid(o.seekp( 0, std::ios_base::cur )).name() << endl;

どの時点で機能が停止するかを確認してください。次に、そこから問題を回避します。

于 2009-01-29T20:19:04.757 に答える