2006年11月09日

MSに翻弄された話

標準規格 != Microsoft実装

ある日ふと思い付いて、とあるコンテナクラスを作ってみようと思った。言語はC++、チョット特殊なマップコンテナだ。STLのコンテナと互換に作っておけば後々便利だろう。作った事無いけど。

とは言え、STLのマップについて熟知しているとはいえない。色々資料を参考にしながら制作する事にした。

さて、何から始めたものか……そうだ、とりあえずstd::map互換の型定義をしてしまっておこう。

私は日頃リファレンスとしてMSDNライブラリ日本語版の2001年10月リリース分を愛用している。キーワードによるインクリメンタルサーチや全文検索

、ブックマーク機能とHTMLヘルプは便利だ。より最新のVisual Studio 2005 MSDN ライブラリもいいが、アレは標準関係が英語だしかなり重いし。

……で、MSDNライブラリ日本語版の2001年10月リリース分のstd::mapの項を参考に次のような骨組みを作った。


template<typename Key_, typename Value_, typename Comperer_ = std::less<key>,
    typename Allocator_ = std::allocator<std::pair<Value_> > >
class Map {
public:
    typedef Key_ key_type;
    typedef Value_ referent_type;
    typedef Comperer_ key_compare;
    typedef Allocator_ allocator_type;
    typedef std::pair<key_type, reference_type> value_type;

public:
    class value_compere
        : public std::binary_function<value_type, value_type, bool>
    {
    };
    typedef allocator_type::size_type size_type;
    typedef allocator_type::difference_type difference_type;
    typedef allocator_type::rebind<value_type>::other::refrence reference;
    typedef allocator_type::rebind<value_type>::other::const_reference
        const_reference;
    class iterator;
    friend iterator;
    class iterator
        : std::iterator<std::bidirectional_iterator_tag, defference_type>
    {
    };
};

……と、此処まで書いて気になった。あれ?確かtemplate引数のアロケータのデフォルト引数ってstd::allocator<std::pair<const Key_, Value_> >じゃ無かったっけ……?

……確かにMSMSDNライブラリは便利だが、標準規格への準拠度という意味では全く信用出来ない非標準の機能を勧める警告をコンパイラに吐かせるような企業だし……。

……気になる。という訳で幾つかの文献で調べてみた。

資料とそれに載っているallocatorの形式
資料形式
MSDNライブラリ日本語版の2001年10月リリース分allocator<Value_>
新C++言語入門 シニア編(下) クラス機能399頁allocator<Value_>
http://www.wakhok.ac.jp/~sumi/stl/header/map.html#templateallocator<pair<Key_, Value_> >
Microsoft Platform SDK for Windows Server 2003 SP1のヘッダallocator<Value_>
gcc version 3.4.2 (mingw-special)のヘッダallocator<pair<Key_, Value_> >

ますます分からなくなってきた。結局ドッチなんだ?
仕方ないので、FDISを参照してみる事に。英語は苦手なんだけどね……。

template <class Key, class T, class Compare = less<Key>, class Allocator = allocator<pair<const Key, T> > > class map;

うーん、という事はヤッパリallocator<pair<Key_, Value_> >の形式が正しいんだろうか……もういいや、FDISに合わせちゃえ。

あれー?まだ相違点がー!

何となくではあるが、とりあえず解決、解決っと。で、つれつれとFDISを眺めていると……

((略)) template <class Key, class T, class Compare = less<Key>, class Allocator = allocator<pair<const Key, T> > > class map { public: // types: typedef Key key_type; typedef T mapped_type; ((略))

……mapped_type?
あれ?確かMSDNライブラリやPlatform SDKreferent_typeってなってなかったか!?

というわけで再び調査。MS製のものはreferent_typeGCCFDISはmapped_typeになっている。興味深い事に新C++言語入門 シニア編(下) クラス機能http://www.wakhok.ac.jp/~sumi/stl/header/map.html#templateはどちらにも触れていない。

うーん、ヤッパリmapped_typeの方が正しいんだろうなぁ。とcppllのログを見つけた。これこれこれ。ヤッパリmapped_typeらしい。

こんの腐れMぇ……あれ?待てよ?

あー結局MSの規格無視か。やれやれ全く困ったもんだ……と思っていたが、ふと、『あれ?』と思った。

たしかMSのC++ライブラリは、かのP.J.Plauger氏の会社が作ってたんじゃなかったっけ?確かにヘッダファイルの下の方にCopyright (c) 1995 by P.J. Plauger. ALL RIGHTS RESERVED.との表記がある……あれ?あれれ??

ふと気づいて

さらに、ふとVisual C++ 2005 Express Editionのincludeフォルダを覗いて見ると……

あ、普通に標準ライブラリって入ってたのね…….NET関係(C++/CLI独自)のヘッダしかないものだとばっかり思ってた。

よく見たらちゃんと標準に合わせた形に修正されているし……

………………あー、うん。アレだ。
みんなPlatform SDKよりVC++2005のライブラリ先に読むように設定気をつけようぜ!!!
…………って事で。

いやマジすんませんMS&Plauger氏。

作ってみようと思った
勿論車輪の再開発は悪だというのは知っているので同じようなものが無いかwebで探してみたが、見つからなかった。最も、私の探し方が悪いだけかもしれないが。
FDIS
Final Draft International Standard。国際規格最終案。本当は『最終案』ではないちゃんとした国際規格(IS)を当たるべきなのかもしれないが有料なので……(^^;ゞ
C++のFDISならば、このページで閲覧する事が出来る。
P.J.Plauger氏
C MAGAZINEに掲載されていた同氏の記事(翻訳)には次のようにある。
title="C MAGAZINE 2006年3月号 14頁"> C/C++の標準規格に従ったライブラリを開発・販売するDinkumwareという会社を経営するかたわら、コンピュータプログラミング分野でのコンサルタントとしても活動している。また、C/C++の標準規格の作成にも携わっていて、アメリカ合衆国、ヨーロッパ、オーストラリアおよび日本での会議に招待されセミナーを行っている。
C++世界ではかなりの有名人だと思われる。
posted by 天井冴太 at 17:41 | Comment(0) | TrackBack(0) | Study | このブログの読者になる | 更新情報をチェックする
投票お願いします 人気blogランキング - 投票する
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

コメント欄右下をドラッグ&ドロップすると、コメント欄の拡大縮小が出来ます。
認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。