我试图阅读一些 pytorch 源代码,但遇到了很多麻烦,因为我不太了解现代 C++。我遇到了以下代码:
c10::optional<OperatorHandle> Dispatcher::findSchema(const OperatorName& overload_name) {
return operatorLookupTable_.read([&] (const ska::flat_hash_map<OperatorName, OperatorHandle>& operatorLookupTable) -> c10::optional<OperatorHandle> {
auto found = operatorLookupTable.find(overload_name);
if (found == operatorLookupTable.end()) {
return c10::nullopt;
}
return found->second;
});
}
read
方法内部是一个lambda函数,其中[&]
通过引用捕获overload_name
和operatorLookupTable_
。 lambda 函数作为一个整体接受一个参数
operatorLookupTable
并返回 c10::optional<OperatorHandle>
类型变量。让我感到困惑的是,该函数仅被定义,尚未被调用,因此发送到 lambda 函数的 operatorLookupTable
类型中没有显式参数。
我做了相当多的研究,似乎变量
operatorLookupTable_
(其方法 read
创建并调用 lambda 函数)作为 lambda 表达式的参数发送(据说如此),但我就是想不通出为什么?我问 ChatGPT,它说 read
方法被定义为以这种方式工作(使用 operatorLookupTable 作为它创建的 lambda 表达式的参数作为自己的参数)? pytorch 库是如此广泛,版本差异如此之大,以至于我无法导航到他们实际定义此 read
方法的位置。另外,这对我来说没有多大意义,可以在方法中定义它。谁能在这里解释一下 lambda 参数吗?
令我困惑的是,该函数仅被定义,尚未被调用,因此发送到 lambda 函数的operatorLookupTable 类型中没有显式参数。
实际使用/调用时,参数将被传递给 lambda/回调。例如,这是一个人为的示例来演示相同的内容,
void func(auto lambda)
{
lambda("some arg"); //actually call the lambda/callback here with some arguments
}
int main()
{
func([](const std::string &s){return 4;});
}