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

时间:2016-10-27 16:07:56

标签: c++ templates abstract-class

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

想象

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

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

2 个答案:

答案 0 :(得分:3)

  

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

是。请注意,您所拥有的是class template,它是表达一系列类的一种方式。它没有上课。您可以通过使用类似Data<int>的类型实例化模板来删除Data的{​​{1}}版本,其中T为int。

  

为什么有必要对函数进行模板化

原因是Data<int>Data<double不是同一个类。就像intdouble不同,在使用不同的模板参数设置类模板时会得到不同的类。如果你想要一个可以处理类模板可以生成的任何函数的函数,那么这个函数也需要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);
}