#author("2024-12-31T21:58:47+09:00","","") #author("2024-12-31T22:00:01+09:00","","") #topicpath ////////////////////////////////////////////////////////////////////////////// * 目次 [#o6c272be] #contents(); ////////////////////////////////////////////////////////////////////////////// * template とは [#t6ecd090] - 関数やクラスの、「一部又は全ての型が異なるが同じ処理」を記述する為の記法。 - template には、関数テンプレートとクラステンプレートがある。 //============================================================================ ** 関数テンプレート [#zdd037fd] //---------------------------------------------------------------------------- *** 可変長引数テンプレート [#w2b7ed06] - テンプレート自体を可変長引数とすることも出来る。 - テンプレート自体を可変長引数とする場合、下記のように記述する: template<typename ... Args> -- ここで、テンプレートパラメータを宣言する typename (又は class)とテンプレートパラメータの間に '''...''' を記述する。 -- 可変長引数テンプレートで宣言したパラメータ(ここでは typename ... Args)は「パラメータ・パック」と呼ばれる。ここには複数の型と変数などのオブジェクトがまとめられているものとして扱われる。 // 0個以上のテンプレートパラメータを受け取る template <typename ... Args> class hoge_t { public: hoge_t(); void set(Args ... args); }; // 0個以上の任意の型のパラメータを受け取る template <typename ... Args> void f(Args ... args); - 例 template <typename ... Args> std::string format( const std::string& fmt, Args ... args ) { size_t len = std::snprintf( nullptr, 0, fmt.c_str(), args ... ); std::vector<char> buff( len + 1 ); std::snprintf( &buff[0], len + 1, fmt.c_str(), args ... ); return std::string( &buff[0], &buff[0] + len ); } //============================================================================ ** クラステンプレート [#n744af20] ////////////////////////////////////////////////////////////////////////////// * テンプレートの特殊化 [#b0472eef] //============================================================================ ** テンプレートの定義をソースに記述した場合 [#mbbc3b67] - テンプレートの定義を書いたソース内でしかそのテンプレートを使用しない場合は、特に問題ない。 - 宣言をヘッダに、定義をソースに書いた場合で、他のソースからそのテンプレートを使用する場合、テンプレートのソースがコンパイルされる時点で、「そのテンプレートがどのテンプレート引数を使って特殊化されるか」が全て明示されていないと、明示されていない分についてはテンプレートの特殊化(実体化)が行われない為、リンクが通らない。このような場合、下記のようにテンプレートのインスタンス化を行うことで必要な実体を生成することが出来る。 template<typename T> class Position { public: Position(T x, T y, T z); <snip> }; // 下記のように、型の適用を明示することを「template のインスタンス化」という。 template class Position<uint16_t>; template class Position<uint32_t>;