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()
答案 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()
的函数修改调用它的对象会非常意外,这实际上是一件好事。