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

Pep*_*Mir 6 c++ templates types wildcard

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

我记得在Java中我们可以使用?通配符,如通用类型 HashMap<Long, ?>.

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

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;
        }
};
Run Code Online (Sandbox Code Playgroud)

并且假设我们想要使用上面类的实例而不指定确切的类型(我在下面的类中使用了?),因为在计算机类只使用方法的情况下无用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;
        }
};
Run Code Online (Sandbox Code Playgroud)

Tar*_*ama 8

您可以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;
}
Run Code Online (Sandbox Code Playgroud)

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

long long computeTotalSize(const vector<Record<T>>& recordVector)
Run Code Online (Sandbox Code Playgroud)


Rei*_*ica 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;
        }
};
Run Code Online (Sandbox Code Playgroud)

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

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

long getSize() const
{
    return size;
}
Run Code Online (Sandbox Code Playgroud)

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