2

私は1つの方法でこのようなものを持っています

    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 は変数であるため、変数の後の 2 つの括弧が何を意味するのか疑問に思っています。おそらく私は何かを誤解していますか?

4

3 に答える 3

8

C++ は「演算子のオーバーロード」をサポートしています。つまり、 のような構文をサポートする型を定義できますa + b。これは、 などの名前で関数を定義することによって機能しますoperator+。オーバーロード可能な演算子がユーザー定義型で使用されると、C++ はこれらの特別な名前を持つ関数を探し、適切な関数が見つかった場合、演算子を関数への関数呼び出しとして扱います。

オーバーロードできる演算子の 1 つは、関数呼び出し演算子です。オブジェクト名を関数のように使用すると、名前付きのメンバー関数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)); 
于 2013-11-12T20:19:57.257 に答える
2

これは、独自のハッシュ テーブル実装を持つ OpenFOAM のように見えます。

src/OpenFoam/containers/HashTable/HashTable/HashTable.H の 454 行目 (少なくとも私のコピーでは) を見ると、オーバーiteratorロードが見つかり、イテレータの現在参照されている値への参照が返されます。operator()operator*

少し明確にするために、C++ では、ドメイン固有の機能を提供するために使用する多くの演算子をオーバーロードできます。これにより、たとえば、代わりにvector.add(otherVector)「明白な」シンタックス シュガーを使用することができますvector + otherVector。欠点は、この質問が示すように、明らかなことは必ずしもそれほど明白ではないということです。

于 2013-11-12T20:38:16.927 に答える
1

This construction

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

means that at first a temporary object of type cstrIter is created using the default constructor

cstrIter()

And after that the function call operator is used for this object

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

次のように式を書き直すと、より明確になります。

cstrIter obj;
obj(U, phi, transport, turbulenceModelName);
于 2013-11-12T20:32:53.600 に答える