必须所有与模板化类型交互的代码也使用模板

Must all code interacting with templated types also use templates?

本文关键字:代码 交互 类型      更新时间:2023-10-16

必须所有与模板化类交互的代码也使用模板吗?

想象

template<T>
class Data {
public:
    Data(T value) {
        this->value = value;
    };
    T getValue() {
        return value;
    };
    virtual size_t size() = 0;
private:
    T value;
};

对于几种可能的T (String, int等),size()将有特定的实现。

注意:我可以有一个抽象类,但是我不能有构造函数/getValue,也不能有虚方法,因为我必须指定它们的参数/返回值类型。

进一步想象我有一个函数,如

template<T>
size_t getSize(Data<T> value) {
    return value.size();
}

虽然size()对于不同的类型是不同的,但是发送方(getSize()方法)不应该关心T

所以问题是为什么有必要模板函数,我可以避免它吗?

必须所有与模板化类交互的代码也使用模板吗?

是的。请注意,您拥有的是一个类模板,它是表达类族的一种方式。它不构成一个类。要做到这一点,你可以用Data<int>这样的类型实例化模板,这将排除Data的一个版本,其中T是int型。

为什么需要模板化函数

原因是Data<int>Data<double不是同一个类。就像intdouble不同一样,当使用不同的模板参数初始化类模板时,您将获得不同的类。正因为如此,如果你想要一个函数可以处理类模板可以产生的任何东西,那么这个函数也需要是函数模板,这样它就可以为每个不同的Data产生一个函数。

和我能避免它吗

您可以做的一件事是让Data从基类派生,然后将size移动到基类中。然后,您可以编写函数以接受对基类的引用,而不是类模板。

这是你想要的吗?

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);
}