Home > C++ > namespaceでクラスメンバを偽装する

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

  • 2007-07-13 (金) 23:34
  • C++

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

例えば、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が使えます。

・・・用途あるのかな。

以上

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://red-treasure.com/report/wp-trackback.php?p=54
Listed below are links to weblogs that reference
namespaceでクラスメンバを偽装する from コスミー報告書[社外秘]

Home > C++ > namespaceでクラスメンバを偽装する

Search
Feeds
Meta
 合計:018987
 今日:0126 昨日:0157

Return to page top