みぃちゃんの頭の中はおもちゃ箱

略してみちゃばこ。泣いたり笑ったり

C++の美しくないところ

2014年09月04日 23時02分55秒 | IT・デジタル
C++の美しくないところ。標準ライブラリのコンテナクラスがコンテナクラスごとに固有のsize_typeを持っていて、ライブラリ利用側で制御できないこと。

例えば、ネットワークを構成するクラスがあり、その内部でノードを管理しているとします。各ノードは複数のノードに接続するものとします。当然、各ノードはコンテナクラスの中に隠蔽され、ライブラリ利用側には公開されません。
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++ではそれができません。

いまいち美しくない。