テンプレートを使っていて、分かりづらかった文法のメモ
引数の 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
*1:ですよね?