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
方法是OperatorBase
class的一部分,是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 True
或 False
根据需要。
因此,要检查 Blob A
的类型是否为 int
,我们必须调用
A->IsType<int>();
但是,如this answer所述,编译器不知道你是想在这里使用带有<int>
的模板,还是与[=31=进行比较](小于)符号。所以我们必须告诉编译器我们在这里使用模板,并调用
A->template IsType<int>();
这同样适用于 InputIsType
方法的情况:在这个例子中我们没有使用 int
,而是使用类型 T
(我们之前定义的),并调用IsType
在向量的元素 idx
上 inputs_
:
inputs_.at(idx)->template IsType<T>();
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
方法是OperatorBase
class的一部分,是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 True
或 False
根据需要。
因此,要检查 Blob A
的类型是否为 int
,我们必须调用
A->IsType<int>();
但是,如this answer所述,编译器不知道你是想在这里使用带有<int>
的模板,还是与[=31=进行比较](小于)符号。所以我们必须告诉编译器我们在这里使用模板,并调用
A->template IsType<int>();
这同样适用于 InputIsType
方法的情况:在这个例子中我们没有使用 int
,而是使用类型 T
(我们之前定义的),并调用IsType
在向量的元素 idx
上 inputs_
:
inputs_.at(idx)->template IsType<T>();