C++の美しくないところ。標準ライブラリのコンテナクラスがコンテナクラスごとに固有のsize_typeを持っていて、ライブラリ利用側で制御できないこと。
例えば、ネットワークを構成するクラスがあり、その内部でノードを管理しているとします。各ノードは複数のノードに接続するものとします。当然、各ノードはコンテナクラスの中に隠蔽され、ライブラリ利用側には公開されません。
このコンテナを使うにあたって、各ノードから参照する相手ノードに文字列で名前を付けて識別する必要が生じたとします。
とすれば任意のデータ (ここではAdditionalのオブジェクト) を受け入れるようにライブラリは作られています (Container::Nodeは公開されていませんが、反復子を通じて間接的かつ安全にアクセスできるものとします)。
ところが、Additional::namesの各要素とContainer::Node::linksの各要素を結びつけるきれいな方法がC++にはありません。Additional::namesの添字の型はvector< std::string>::size_typeですし、Container::Node::linksの添字の型はvector< Node *>::size_typeであり、対応づけられないのです。どちらも実質的にはsize_tですが、論理的には別の型です。本来ならAdditional::namesを定義するときに添字の型としてContainer::Node::linksの添字の型を指定すべきですが、C++ではそれができません。
いまいち美しくない。
例えば、ネットワークを構成するクラスがあり、その内部でノードを管理しているとします。各ノードは複数のノードに接続するものとします。当然、各ノードはコンテナクラスの中に隠蔽され、ライブラリ利用側には公開されません。
template< class T> class Container { public: private: class Node { std::vector< Node *> links; // Internally used ... // Other internally used variables T additional_; // Accepts additional data from library users }; };
このコンテナを使うにあたって、各ノードから参照する相手ノードに文字列で名前を付けて識別する必要が生じたとします。
struct Additional {
std::vector< std::string> names;
};
Container< Additional *> c;
とすれば任意のデータ (ここではAdditionalのオブジェクト) を受け入れるようにライブラリは作られています (Container::Nodeは公開されていませんが、反復子を通じて間接的かつ安全にアクセスできるものとします)。
ところが、Additional::namesの各要素とContainer::Node::linksの各要素を結びつけるきれいな方法がC++にはありません。Additional::namesの添字の型はvector< std::string>::size_typeですし、Container::Node::linksの添字の型はvector< Node *>::size_typeであり、対応づけられないのです。どちらも実質的にはsize_tですが、論理的には別の型です。本来ならAdditional::namesを定義するときに添字の型としてContainer::Node::linksの添字の型を指定すべきですが、C++ではそれができません。
いまいち美しくない。