C++ 中的任何泛型类型 class
Any generic type in C++ class
C++ 中有没有一种方法可以将任何类型* 指定为模板的类型,例如通过通配符或某些关键字。
我记得在 Java 中我们可以使用 ?作为通用类型的通配符,如 HashMap<Long, ?>
.
我尝试使用示例代码更好地解释问题。假设我们有如下记录 class:
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;
}
};
并且假设我们想使用上面 class 的实例而不指定确切的类型(我在下面的 class 中使用了 ?),只是因为在 class 的情况下没有用=24=] 计算机只使用方法 Record::getSize()
:
class Computer
{
public:
long long computeTotalSize(vector<Record<?>> recordVector)
{
long long totalSize = 0;
for (vector<Record<?>>::iterator it = recordVector.begin() ; it != recordVector.end(); ++it)
totalSize += (*it).getSize();
return totalSize;
}
};
您可以将 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;
}
请注意,您还应该通过引用传递向量以避免复制整个内容:
long long computeTotalSize(const vector<Record<T>>& recordVector)
它不能像 Java 那样完成,因为 C++ 模板从根本上不同于 Java 泛型(C++ 模板生成完全不同的类型,而不是在 type-erased 类型)。但是,您可以将 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()
的函数修改调用它的对象是非常意外的,这实际上是一件好事。
C++ 中有没有一种方法可以将任何类型* 指定为模板的类型,例如通过通配符或某些关键字。
我记得在 Java 中我们可以使用 ?作为通用类型的通配符,如 HashMap<Long, ?>
.
我尝试使用示例代码更好地解释问题。假设我们有如下记录 class:
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;
}
};
并且假设我们想使用上面 class 的实例而不指定确切的类型(我在下面的 class 中使用了 ?),只是因为在 class 的情况下没有用=24=] 计算机只使用方法 Record::getSize()
:
class Computer
{
public:
long long computeTotalSize(vector<Record<?>> recordVector)
{
long long totalSize = 0;
for (vector<Record<?>>::iterator it = recordVector.begin() ; it != recordVector.end(); ++it)
totalSize += (*it).getSize();
return totalSize;
}
};
您可以将 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;
}
请注意,您还应该通过引用传递向量以避免复制整个内容:
long long computeTotalSize(const vector<Record<T>>& recordVector)
它不能像 Java 那样完成,因为 C++ 模板从根本上不同于 Java 泛型(C++ 模板生成完全不同的类型,而不是在 type-erased 类型)。但是,您可以将 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()
的函数修改调用它的对象是非常意外的,这实际上是一件好事。