c++ 变量后面的两个括号表示什么?

yx2lnoni  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(113)

我有一种方法

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是一个变量,我想知道变量后面的两个括号是什么意思。也许我误解了什么?

monwx1rj

monwx1rj1#

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

uurity8g

uurity8g2#

这看起来像OpenFOAM,它有自己的哈希表实现。
如果你查看src/OpenFoam/containers/HashTable/HashTable/HashTable. H的第454行(至少在我的副本中),你会发现iterator重载了operator()operator*以返回对迭代器当前引用值的引用。
为了澄清一点,C++允许你重载many的操作符来提供特定于域的功能。这允许,比如说,vector.add(otherVector)使用vector + otherVector的“明显”语法糖。缺点是,明显的东西并不总是那么明显,正如这个问题所展示的。

yrwegjxp

yrwegjxp3#

这种结构

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

字符串
表示首先使用默认构造函数创建cstrIter类型的临时对象

cstrIter()


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

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


你可以用下面的方式来重写这个表达式

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

相关问题