Вы можете, но это не будет так полезно, как вы думаете. Вы можете определить структуры следующим образом:
#include <string>
#include <vector>
using namespace std;
template<typename Val>
class Base
{
public:
virtual Val DoIt() const = 0;
};
template<typename Val>
class Derived : public Base<Val>
{
public:
Derived(const Val& val) : val_(val) {};
Val DoIt() const { return val_; }
protected:
Val val_;
};
int main()
{
Derived<string> sd("my string");
string sd_val = sd.DoIt();
Derived<float> fd(42.0f);
float fd_val = fd.DoIt();
}
Но когда вы определяете абстрактные базовые типы, вам часто требуется их коллекция и возможность вызывать указатель базового класса, чтобы получить полиморфное поведение. Если вы шаблонизируете базовый класс, вы не сможете этого сделать, потому что каждый вариант параметров шаблона будет создавать свой тип. Base<int>
полностью отличается от Base<string>
, и вы не можете просто получить Base*
, который указывает на любой из них.
Этот код не скомпилируется:
vector<Base*> my_objs;