namespaceでクラスメンバを偽装する

記憶を消せるようになったら、えーと、んーと、消したい記憶なんてないな・・・。

例えば、std::ios::_Openmodeはファイルストリームのオープンモードを指定する引数の型です。
他の環境は知りませんが、VC.NETではそうなってます。
しかーしながら、WindowsCE4.2ではそもそもストリームがないので、std::ios::_Openmodeなんてありません。
したがって、もしstd::ios::_Openmodeをどっかで使っているソースがあるとして、それをCE環境でコンパイルしようとしても無理な話です。(そもそもストリームがないんだから、そんなことをしたらだめだろう、といいたいでしょうがそこは度外視で。)
よって、どーしてもstd::ios::_Openmodeを使いたいんだ!という場合には定義するしかありません。


namespace std {
    class ios {
    public:
        typedef int _Openmode;
    
        static const _Openmode binary = 0;    // vc6.0 だと未対応
        static const _Openmode app = 1;
    }
}

素直にやれば上記のようにすればいいと思われます。std::ios::binaryが使えるはずです。
が、VC6やそれを基盤としているEmbeddedVC4.0では上記のような「static const 整数」のヘッダでの初期化に対応していません。(言語仕様的には”static const 整数型”の場合はヘッダで初期化していい、はず。)
そこでどうするか。


 namespace std {
    namespace ios {
        typedef int _Openmode;
    
        static const _Openmode binary = 0;    // これならヘッダで初期化OKっぽい。staticなので翻訳単位はインクルードファイルに限定される。
        static const _Openmode app = 1;
    }
}

上記のようにnamespaceでごまかせました。std::ios::binaryが使えます。

・・・用途あるのかな。

以上

コスミー について

昔(?)はゲーム作ってました。 今もなんか作ろうとしています。
カテゴリー: C++ パーマリンク

コメントを残す

メールアドレスが公開されることはありません。