C ++类中的任何泛型类型

时间:2016-01-12 14:26:25

标签: c++ templates types wildcard

C ++中是否有一种方法可以将任何类型*指定为模板类型,例如通过通配符或某个关键字。

我记得在Java中我们可以使用?通配符作为泛型类型,如x

我尝试使用示例代码更好地解释问题。假设我们有以下Record类:

HashMap<Long, ?>

并且假设我们想要使用上面类的实例而不指定确切的类型(我在下面的类中使用了?),因为在类计算机仅使用方法template<typename T> class Record { private: T content; long size; public: Record(T _content, long _size) { this->content = _content; this->size = _size; } T getContent() { return this->content; } long getSize() { return this->size; } }; 的情况下,这是无用的:

Record::getSize()

2 个答案:

答案 0 :(得分:8)

您可以使用记录模板参数将--wait作为模板函数作为其模板参数:

computeTotalSize

请注意,您还应该通过引用传递向量,以避免复制整个事物:

template <typename T>
long long computeTotalSize(vector<Record<T>> recordVector)
{
    long long totalSize = 0;
    for (vector<Record<T>>::iterator it = recordVector.begin() ; it != recordVector.end(); ++it)
        totalSize += (*it).getSize();

        return totalSize;
}

答案 1 :(得分:7)

它不能像在Java中那样完成,因为C ++模板与Java泛型有根本的不同(C ++模板生成完全不同的类型,而不是类型擦除类型的顶级构造)。但是,您可以将computeTotalSize设为功能模板:

class Computer
{
    public:
        template <class T>
        long long computeTotalSize(const vector<Record<T>>& recordVector)
        {
            long long totalSize = 0;
            for (auto it = recordVector.begin() ; it != recordVector.end(); ++it)
                totalSize += it->getSize();

            return totalSize;
        }
};

注意我冒昧地简化了代码的语法;唯一的行为更改是使用const&传递向量,以防止复制它。

请注意,对const&的更改需要将getSize()标记为const成员函数:

long getSize() const
{
    return size;
}

由于名为getSize()的函数修改调用它的对象会非常意外,这实际上是一件好事。