テンプレートクラスにテンプレート関数なので、template template と指定する2020年02月25日 14時50分23秒

テンプレートクラスにテンプレート関数を実装したり、テンプレートは型非依存の関数を書くのには優れているが、文法が随分と複雑になった。

このテンプレートクラスに所属するテンプレートメンバ関数を別途実装するには以下のような template template と二度重ねる形になる。

#include <iostream>

template< typename T1 >
class Class
{
    T1 value_;

public:
    Class( const T1& value ) : value_( value ) {}

    template< typename T2 > void print() const;
};

template< typename T1 >
template< typename T2 >
void Class< T1 >::print() const
{
    std::cout << static_cast< T2 >( value_ ) << std::endl;
}

int main()
{
    Class< float > c( 3.14 );
    c.print< int >();
    c.print< double >();
    c.print< bool >();
}
実行結果は前と同じ。
% c++ template_function_of_template_class2.cpp
% ./a.out 
3
3.14
1

AIX の xlc コンパイラを除く、Sun CC、GNU G++、そして、Clang C++ コンパイラはテンプレートが増えると、指数関数的にメモリの利用量が増えていく。AIX の xlc はメモリは増えないが時間が掛かるようだ。その為、全てのテンプレートをインラインで実装すると、それだけコンパイルに時間が掛かるようになる。そこで、実装を分けて、実装が必要なところだけヘッダファイルで実装を読み込むと、メモリの利用も抑え、コンパイルを早くする事が出来る。

前回