#テンプレートクラスをまとめたい
テンプレートクラスのテンプレート引数が違くても、中身は大体同じだから同じものとして扱いたい!ということがまれにあります。
例えば
template<typename T>
class A{
private:
T _variable;
public:
A(T variable) : _variable(variable){}
void print(){
std::cout << _variable << std::endl;
}
}
こんなテンプレートクラスがあったとして、**print()**はテンプレート引数が何であれ出力するだけなので
std::vector<A> vec;
int main(){
vec.push_back(A(1));
vec.push_back(A("hello"));
vec.push_back(A(5.0));
for(auto v : vec)v.print();
}
みたいなことをしたくてもvectorのテンプレート引数Aが不完全なのでコンパイルできません。
#解決手段
こういうときはクラス継承と仮想関数を使います。
class A{
public:
virtual ~A(){}
virtual void print() = 0;
}
template<typename T>
class B : public A{
private:
T _variable;
public:
B(T variable) : _variable(variable){}
virtual ~B(){}
virtual void print() override{
std::cout << _variable << std::endl;
}
}
std::vector<A*> vec;
int main(){
vec.push_back(new B(1));
vec.push_back(new B("hello"));
vec.push_back(new (5.0));
for(auto v : vec)v->print();
}
思いついてみれば簡単なことかもしれませんが、「テンプレートクラス」という要素に惑わされて頭を抱えるときもあると思いますので参考程度に。