テンプレートを使っていて、分かりづらかった文法のメモ

引数の char[] 型から文字数を知る

まずは、char[] を引数に受けて文字数を知りたい時のテンプレートの書き方。

	template<typename CharType, int N>
	void copy(CharType (&c)[N], const std::string& str) {
		std::strncpy(c, str.c_str(), N);
	}

「CharType (&c)[N]」のところがポイントです。普段、関数の引数に受け取る時には「char c」と書けるのですが、これは「char (&c)」のシンタックスシュガー*1なのでテンプレートで書く場合には元の形式にする必要があります、と。 コメント欄参照のこと。この書き方は、templateがないと固定サイズの配列を受け取ることしかできないので、使われることがほとんどないだけのことでした。また、「char c[] 」で受け取った場合には、サイズが不明な配列への参照になるので、実質最初の要素へのポインタと同様に使えるわけでした。

テンプレート・テンプレート・パラメータ

次は、テンプレート・テンプレート・パラメータの書き方。

template<typename T>
struct MyQueue {
	template< template<class V, class Allocator = std::allocator<V> >class Container >
	void enqueueAll(const Container<T>& c) {
		std::copy(c.begin(), c.end(), std::back_inserter(queue_));
	}
	std::deque<T> queue_;
};

そもそも書き方を忘れやすいのでメモ。この enqueueAll には、std::vectorや std::dequeなどのSTLのコンテナと同じような型を、どれでも受け取ることができます。あまり使うことはないのですが、フレームワークレベルでの実装には便利ですね。

*1:ですよね?