变量后的两个括号

Two parentheses after variable?

本文关键字:两个 变量      更新时间:2023-10-16

>我在一种方法中有这样的东西

    autoPtr<LESModel> LESModel::New   
 95 (
 96  const volVectorField& U,
 97  const surfaceScalarField& phi,
 98  transportModel& transport,
 99  const word& turbulenceModelName
100 )
101 {
     ...
122  dictionaryConstructorTable::iterator cstrIter =                       
123  dictionaryConstructorTablePtr_->find(modelType);
     ...
143  return autoPtr<LESModel>      
144  (
145  cstrIter()(U, phi, transport, turbulenceModelName)
146  ); 
147  }

如果我是对的cstrIter是类 dictionaryConstructorTable::iterator 的变量(虽然找不到这个类),从第 143 行开始,调用构造函数 autoPtr<LesModel> 并返回结果。因此,构造函数autoPtr<LESModel>后面的括号应该是参数,由于 cstrIter 是一个变量,我想知道变量后面的两个括号是什么意思。也许我看错了什么?

C++支持"运算符重载",这意味着您可以定义支持语法的类型,如a + b。这通过定义具有名称的函数(例如 operator+ )来工作。当可重载运算符与用户定义的类型一起使用时,C++查找具有这些特殊名称的函数,如果找到合适的函数,则将运算符视为对该函数的函数调用。

可以重载的运算符之一是函数调用运算符。当您使用对象名称时,将调用名为 operator() 的成员函数,就好像它是一个函数一样:

struct S {
  void operator() (void) {
    std::cout << "Hello, World!n";
  }
};
int main() {
  S s;
  s(); // prints "Hello, World!n"
}

看起来dictionaryConstructorTable::iterator重载函数调用运算符并返回某种类型,该类型也重载函数调用运算符(或仅使用内置运算符)。

将函数调用运算符的使用替换为普通成员函数可能会更清楚地了解正在发生的事情:

return autoPtr<LESModel>( cstrIter.foo().bar(U, phi, transport, turbulenceModelName)); 

看起来像OpenFOAM,它有自己的哈希表实现。

如果你查看src/OpenFoam/containers/HashTable/HashTable/HashTable.H,第454行(至少在我的副本中),你会发现iterator重载operator()operator*返回对迭代器当前引用值的引用。

澄清一点,C++允许您重载许多用于提供特定于域的功能的运算符。这允许vector.add(otherVector)使用vector + otherVector的"明显"句法糖。缺点是显而易见的东西并不总是那么明显,正如这个问题所表明的那样。

此结构

cstrIter()(U, phi, transport, turbulenceModelName)

意味着首先使用默认构造函数创建 cstrIter 类型的临时对象

cstrIter()

之后,函数调用运算符用于此对象

cstrIter()(U, phi, transport, turbulenceModelName)

更清楚的是,您可以通过以下方式重写表达式

cstrIter obj;
obj(U, phi, transport, turbulenceModelName);