变量后面的两个括号代表什么?

问题描述 投票:0回答:3

我用一种方法有类似的东西

    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++ constructor parentheses
3个回答
8
投票

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)); 

2
投票

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

如果您查看 src/OpenFoam/containers/HashTable/HashTable/HashTable.H,第 454 行(至少在我的副本中),您会发现

iterator
重载
operator()
operator*
以返回对的引用迭代器当前引用的值。

为了澄清一点,C++ 允许您重载许多 用于提供特定于域的功能的运算符。例如,这允许

vector.add(otherVector)
使用
vector + otherVector
的“明显”语法糖来代替。缺点是显而易见的事情并不总是那么明显,正如这个问题所表明的那样。


1
投票

这个建筑

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

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

cstrIter()

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

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

你可以用以下方式重写表达式会更清楚

cstrIter obj;
obj(U, phi, transport, turbulenceModelName);
© www.soinside.com 2019 - 2024. All rights reserved.