Caffe2 InputIsType方法中模板语句的解释

Explanation of template statement in Caffe2 InputIsType method

Caffe2框架在文件caffe2/core/operator.h中包含以下代码:

  template <typename T>
  inline bool InputIsType(int idx) {
     return inputs_.at(idx)->template IsType<T>();
  }

我不明白这个代码片段的第三行:为什么这里使用template语句?据我所知,template 后面总是跟着 <> 并用于定义类型 T,就像在这个代码片段的第一行中一样。

为什么调用IsType<T>()前要写template

InputIsType方法是OperatorBaseclass的一部分,是Caffe2中所有算子的基础class。每个运算符包含(除其他外)以下私有字段(在 caffe2/core/operator.h 中定义):

vector<const Blob*> inputs_;
vector<Blob*> outputs_;

这些是您的操作员的输入和输出。由于运算符可以有多个输入 and/or 多个输出,因此两者都是向量。

InputIsType 方法采用输入 int idx,它定义了要查看的输入 Blob(即 InputIsType(0) 是第零个输入 Blob,依此类推)并进行比较该特定 Blob 的类型为 <T> 类型。这是使用 Blob class 的 IsType 方法完成的,它在 caffe2/core/blob.h 中定义:

/**
 * Checks if the content stored in the blob is of type T.
 */
template <class T>
bool IsType() const { return meta_.Match<T>(); }

注意:这将类型 T 与我们的 Blob 类型相匹配。我不会详细介绍它是如何工作的。让我们假设这个 returns TrueFalse 根据需要。

因此,要检查 Blob A 的类型是否为 int,我们必须调用

A->IsType<int>();

但是,如this answer所述,编译器不知道你是想在这里使用带有<int>的模板,还是与[=31=进行比较](小于)符号。所以我们必须告诉编译器我们在这里使用模板,并调用

A->template IsType<int>();

这同样适用于 InputIsType 方法的情况:在这个例子中我们没有使用 int,而是使用类型 T(我们之前定义的),并调用IsType 在向量的元素 idxinputs_:

inputs_.at(idx)->template IsType<T>();