在C++中,方法前的template<class key, class type>是什么意思?

7

我拿到了这段代码,正在尝试理解其中的规则。在.cpp文件中定义的所有方法都在它们前面写上了template<class KeyType, class DataType>。这是什么意思呢?

例如:

//Constructor
template<class key, class type>
MyOperation<key, type>::MyOperation()
{
  //method implementation
}

//A method
template<class key, class type>
MyOperation<key, type>::otherOperation()
{
  //method implementation
}

谢谢


其他人已经给出了很好的答案 - 我只想指出,在标准库头文件中,您会发现类似的东西,例如std::map::insert - std::map、std::set和std::vector以及其他标准容器都是模板类。 - user180247
4个回答

5

这个类是一个模板类,可以通过类型参数化。要创建此类的实例,您可以编写例如:

MyOperation<int, int> myop;

这里有一篇关于C++模板的不错文章(链接)。模板是C++中重要的一部分,但需要很长时间才能熟练掌握。C++标准库的很大一部分使用了模板(这通常被非正式地称为STL)。例如,vector<T>是一个类型为T的模板。


5

这个问题可能已经有了一个很好的答案,但我也想把我的意见加入其中。

C++允许在程序结构的声明和实现之间进行分离。这源于C/C++程序员如何向彼此发布新功能的方式:头文件包含在依赖编译单元中,而不是那些单元依赖于编译中存在的元数据(就像你如果使用C#或Java一样预期)。

每次你给编译器一个指令,无论它是一个声明(“将会有这个具有这个接口的东西”)还是一个实现(“这里是这个具有这个接口和这些行为的东西”),你都有机会将该指令转化为模板。

事实上,你有这个选择的机会,而不是必须这样做,这比像Java和C#这样的更现代的语言给你更多的灵活性。

考虑下面的模板(我有点生疏,请轻微忽略语法问题):

template<typename Junk>
class IGotJunk {
private:
  Junk myJunk_;
public:
  void SetJunk(Junk const& source);
  Junk const& GetJunk() const;
}

您所说的模板的“典型”实现可能包括以下默认行为:

template<typename Junk>
void IGotJunk<Junk>::SetJunk(Junk const& source)
{
  myJunk_ = source;
}

然而,对于字符串来说,存在一个风险,就是在指针被复制后,字符串可能会被修改。在这种情况下,您可以提供一种专门的行为,以确保复制的是字符串本身,而不是指针(再次强调,这已经是很久很久以前的事情了)...

void IGotJunk<char*>::SetJunk(char* const& source)
{
  free(myJunk_);
  myJunk_ = malloc(strlen(source) + 1);
  strcpy(myJunk_, source);
}

您可以对GetJunk()做类似的操作。这可能是您必须为创建的每个工件声明模板参数的原因:因为您可能不希望它们在每种情况下都相同。


1

它告诉C++编译器,声明后面的内容是模板。

更具体地说,在其后的任何内容中,KeyType和DataType这些字眼是某个类型的占位符名称,在调用该方法时将明显或指定该类型。此时,编译器接受模板,根据所使用的任何内容在该方法中替换KeyType和DataType,并编译该副本。

在您展示的代码示例中,模板部分是类,因此可能实际上不使用这些方法 - 但是每当使用它们时,C ++需要能够将方法的通用实现与类绑定。


0

这只是意味着在头文件中,模板类被定义为:

template<class key, class type>
class MyOperation
{
   ...
};

因此,当你在 .cpp 文件中实现方法时,需要包含模板参数:

template<class key, class type> MyOperation<key, type>::

就像这样:

template<class key, class type> MyOperation<key, type>::otherOperation() { ... }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接