標準規格 != 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_> >じゃ無かったっけ……?
……確かにMSのMSDNライブラリは便利だが、標準規格への準拠度という意味では全く信用出来ない。非標準の機能を勧める警告をコンパイラに吐かせるような企業だし……。
……気になる。という訳で幾つかの文献で調べてみた。
| 資料 | 形式 |
|---|---|
| MSDNライブラリ日本語版の2001年10月リリース分 | allocator<Value_> |
| 新C++言語入門 シニア編(下) クラス機能399頁 | allocator<Value_> |
| http://www.wakhok.ac.jp/~sumi/stl/header/map.html#template | allocator<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 SDKはreferent_typeってなってなかったか!?
というわけで再び調査。MS製のものはreferent_type、GCCとFDISは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++世界ではかなりの有名人だと思われる。
