Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的任何泛型类型+;班 < > C++中有一种方法可以将任何类型*指定为模板的类型,例如通过通配符或某些关键字。p>_C++_Templates_Types_Wildcard - Fatal编程技术网

C+中的任何泛型类型+;班 < > C++中有一种方法可以将任何类型*指定为模板的类型,例如通过通配符或某些关键字。p>

C+中的任何泛型类型+;班 < > C++中有一种方法可以将任何类型*指定为模板的类型,例如通过通配符或某些关键字。p>,c++,templates,types,wildcard,C++,Templates,Types,Wildcard,我记得在Java中,我们可以使用?通配符作为泛型类型,如HashMap 我试图用一个示例代码更好地解释这个问题。假设我们有以下记录类: template<typename T> class Record { private: T content; long size; public: Record(T _content, long _size) { this->conten

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

我试图用一个示例代码更好地解释这个问题。假设我们有以下记录类:

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;
        }
};

您可以使用记录模板参数作为模板参数,使
computeTotalize
成为模板函数:

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 computetotalize(向量记录向量)
{
长总尺寸=0;
对于(vector::iterator it=recordVector.begin();it!=recordVector.end();++it)
totalSize+=(*it).getSize();
返回总大小;
}
请注意,还应通过引用传递向量,以避免复制整个内容:

long long computeTotalSize(const vector<Record<T>>& recordVector)
long-long computeTotalize(常量向量和记录向量)

>P>不能像java一样,因为C++模板与java泛型根本不同(C++模板生成完全不同类型,而不是在类型擦除类型之上的高级构造)。但是,您可以使
computeTotalize
成为函数模板:

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;
        }
};

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

如果只使用了
size()
,为什么不传递一个大小向量呢?为什么要传递
记录的向量?无论如何,您可以始终使用一些最小的虚拟类型,例如
char
。您可以使函数与任何记录类型一起工作,就像您使记录与任何类型一起工作一样。正如@Kevin所说,如果您想处理不同的
记录
类型,您可以使
computetotalize
成为一个模板。另一种方法是从声明虚拟
size()
函数的接口派生
Record
。但是传递的向量必须是(可能是智能)指针的向量。旁注:仔细检查
记录
构造函数。用于设置字段值。您可能应该使用
记录(const T&\u content,long\u size)
(如果合适,还可以使用移动版本)。C++不是java java,现在(最终拷贝拷贝)<代码> java内容< /C> >两次拷贝。边注2:<代码>获取< /Cord>前缀在Java中是有用的,因为Java有内省,但是它们在C++中是负值:只是无用的冗赘。
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;
        }
};
long getSize() const
{
    return size;
}