Pergunta

C ++ formato macro / in-line ostringstream

A questão não era para uma macro que permite a concatenação de linha de objetos para criar uma string, iostream de estilo.

A resposta foi:

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

Uso (por exemplo):

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

Isso funciona muito bem - com o GCC. Ele compila e é executado em Visual C ++ 2005, também. Mas com o último, todos os usos do resultado macro em cadeias vazias, e estou bastante surpreso quanto ao porquê e como corrigi-lo ...?

Foi útil?

Solução

Infelizmente eu não tenho acesso a um compilador MSVC para teste contra.

Em minhas experiências anteriores com as ferramentas da Microsoft, parece que as definições e padrões de linguagem da Microsoft trata como pouco mais que um guia. (Eu perdi muito tempo em projetos apenas para descobrir tradição quebrou microsoft com algo tão básico como C99.)

Dada esta situação, lamentavelmente, eu sugiro que você experimentar com uma série de programas triviais. Coisas como:

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

Ou talvez:

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

Tente ver em que ponto as coisas param de funcionar. Então contornar o problema de lá.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top