2013-11-12 1 views
2

у меня есть что-то подобное в одном методеДве круглые скобки после переменной?

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 является переменной, мне интересно, что означают две скобки после переменной. Может быть, я что-то неправильно понимаю?

+1

Они не фигурные скобки ... они скобки. Это фигурные скобки: '{}' – texasbruce

+1

@texasbruce: Я исправлял это, когда вы комментировали. – Clifford

+1

Похоже, OpenFOAM мне :) – Bernhard

ответ

7

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

Эта конструкция

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

означает, что в первый временный объект типа cstrIter является созданный с использованием конструктора по умолчанию

cstrIter() 

A й после этого оператор вызова функции используется для этого объекта

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

Это было бы более понятно, можно переписать выражение следующим образом

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

Это выглядит как OpenFOAM, который имеет свой собственный хэш таблицы.

Если вы посмотрите в И/OpenFOAM/контейнеры/HashTable/HashTable/HashTable.H, строка 454 (по крайней мере, в моей копии), вы обнаружите, что iterator перегрузки operator() и operator* возвращать ссылку на итератор в настоящее время ссылочное значение.

Чтобы немного разъяснить, C++ позволяет вам перегружать many операторов, которые вы используете для предоставления функциональных возможностей домена. Это позволяет, скажем, vector.add(otherVector) использовать вместо этого «очевидный» синтаксический сахар vector + otherVector. Недостатком является то, что очевидно, что это не всегда так очевидно, как показывает этот вопрос.

 Смежные вопросы

  • Нет связанных вопросов^_^