0

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

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

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

为什么我们需要template在调用之前写IsType<T>()

4

1 回答 1

0

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

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

这些是您的操作员的输入和输出。由于算子可以有多个输入和/或多个输出,它们都是向量。

InputIsType方法接受一个 input int idx,它定义了要查看的输入 Blob(即InputIsType(0)第零个输入 Blob,依此类推)并将该特定 Blob 的类型与 type 进行比较<T>。这是使用类的IsType方法完成的Blob,该方法定义在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 的类型相匹配。我不会详细说明它是如何工作的。让我们假设这会返回TrueFalse根据需要返回。

因此,要检查 BlobA是否具有 type int,我们必须调用

A->IsType<int>();

但是,如本答案中所述,编译器不知道您是否要在<int>此处使用模板,或者您是否要与<(小于)符号进行比较。所以我们必须告诉编译器我们在这里使用模板,然后调用

A->template IsType<int>();

这同样适用于方法的情况:我们使用类型(我们之前定义的),InputIsType而不是在此示例中使用,并调用向量的元素:intTIsTypeidxinputs_

inputs_.at(idx)->template IsType<T>();
于 2017-05-08T06:48:33.843 回答