所有与模板化类交互的代码都必须使用模板吗?
想象
template<T>
class Data {
public:
Data(T value) {
this->value = value;
};
T getValue() {
return value;
};
virtual size_t size() = 0;
private:
T value;
};
对于几个可能的size()
(String,int等),将会有T
的特定实现。
注意:我可以有一个抽象类,但是我不能既没有构造函数/ getValue也没有虚拟方法,因为我必须指定它们的参数/返回值类型。
进一步想象我有
等功能template<T>
size_t getSize(Data<T> value) {
return value.size();
}
虽然每个不同类型的size()
会有所不同,但发件人(getSize()
方法)不应该关心T
。
所以问题是为什么有必要对函数进行模板化,我可以避免它吗?
答案 0 :(得分:3)
所有与模板化类交互的代码都必须使用模板吗?
是。请注意,您所拥有的是class template,它是表达一系列类的一种方式。它没有上课。您可以通过使用类似Data<int>
的类型实例化模板来删除Data
的{{1}}版本,其中T
为int。
为什么有必要对函数进行模板化
原因是Data<int>
和Data<double
不是同一个类。就像int
和double
不同,在使用不同的模板参数设置类模板时会得到不同的类。如果你想要一个可以处理类模板可以生成的任何函数的函数,那么这个函数也需要f unction template,因此它可以为生成的每个不同的Data
标记一个函数。
我可以避免吗
您可以做的一件事是从基类中获取Data
,然后将size
移动到基类中。然后你可以编写函数来接受对基类的引用,而不是类模板。
答案 1 :(得分:2)
这就是你要找的东西吗?
class Base
{
public:
virtual size_t size() = 0;
};
template<typename T>
class Data : public Base
{
public:
Data(T value) {
this->value = value;
};
T getValue() {
return value;
};
size_t size()
{
return this->value.size();
}
private:
T value;
};
size_t getSize(Base& value)
{
return value.size();
}
void test()
{
std::vector<int> vi;
Data<std::vector<int>> d(vi);
getSize(d);
}