1

コードは次のとおりです。

#include <iostream>
#include <iomanip>
#include <typeinfo>

#if 0
std::ostream &foo(std::ostream &os, std::ios_base &(*x)(std::ios_base &), bool show_id = false)
{ 
    if ( show_id )
        os << "(" << typeid(x).name() << ") ";
    return os << x;
}
#endif

template<typename T>
std::ostream &foo(std::ostream &os, T const &t, bool show_id = false)
{
    if ( show_id )
        os << "(" << typeid(t).name() << ") ";

    return os << t;
}

int main()
{
    foo(std::cout, std::hex) << 255 << std::endl;
    foo(std::cout, ".") << std::hex << 255 << std::dec << std::endl;

    foo(std::cout, std::hex, true) << 255 << std::endl;
}

bcc32 6.70 および bcc32 5.82 を使用すると、出力は次のようになります。

401358255
.ff
(std::ios_base & (*)(std::ios_base &) const) 401368255

bcc64 6.70 (clang ベース) と g++ 4.8.2 を使用すると、出力は次のようになります。

ff
.ff
(FRSt8ios_baseS0_E) ff

clang と gcc は bcc32 よりも評判が良いため、正しいと思います。

コメントアウトされた関数を有効にすると、bcc32 は次のように出力します。

ff
.ff
(std::ios_base & (*)(std::ios_base &)) ff

最初のバージョンで何がうまくいかないのですか?おそらく、オーバーロードの解決に関するコンパイラのバグですが、bcc32 が何をしているのか、または出力constの最後に何があるのか​​ わかりません。typeid

4

0 に答える 0