2016-08-09 3 views
5

今日、私はコードのいくつかを調べようとしましたが、私はこの行に固執しています。このstd :: stringコンストラクタの意味は何ですか

std::vector<std::string(SomeClassInterface::*)()> ListOfFnPointers; 

このstd :: stringコンストラクタの意味はなんですか?私はthisに行きましたが、私はそれが何を意味するか分かりません。

それは次のようにコードで使用され、その宣言の意味は何

if (!ListOfFnPointers.empty()) 
{ 
    std::vector<std::string> StringList; 
    for (auto Fn : ListOfFnPointers) 
    { 
     StringList.push_back((pSomeClassObj->*Fn)()); 
    } 
    ... 
} 
  1. 正確にこの機能はpSomeClassObj->*Fnで何をしていますか?
+2

ヒント:名前 'ListOfFnPointers'が重要です。 – juanchopanza

+0

ありがとうございました。私は関数ポインタについて考えたことはありません。 –

答えて

5

std::stringコンストラクタとは関係ありません。

std::string(SomeClassInterface::*)()はタイプpointer to member functionであり、メンバ関数はSomeClassInterfaceクラスに属し、std::stringを返します。パラメータはありません。

->*は、pointer-to-member access operator(さらに.*)である。 (pSomeClassObj->*Fn)()は、pSomeClassObjのメンバ関数を呼び出します。この関数は、タイプがSomeClassInterface*のポインタであるはずです。

+0

ありがとうございました。今私は明確です –

4

これはコンストラクタではなく、std :: stringを返すパラメータを持たない関数へのポインタです。

for (auto Fn : ListOfFnPointers) 
{ 
    StringList.push_back((pSomeClassObj->*Fn)()); 
} 

プッシュバックので、作業している以上だ - ((pSomeClassObj> * FN))、これらの関数への呼び出しで、結果がのstd ::文字列です。

更新日:

  1. それが機能するためのポインタのベクトル:: STDの宣言です。各関数はSomeClassInterfaceに属し、パラメータを取らずにstd :: stringを返します。

  2. このコードの場合(pSomeClassObj - > * Fn)()は、オブジェクトpSomeClassObjの関数を呼び出します。ここで、Fnはこの関数へのポインタであり、pSomeClassObjのメンバです。

+0

ありがとうございます。今私は明確です –

3

あなたがC++11を使用する場合は、あなたがこのようなコードを書くことができます:

using FunctionPointer = std::string (SomeClassInterface::*)(); 
std::vector<FunctionPointer> ListOfFnPointers; 

あなたは、このリンクを読むことができます:http://en.cppreference.com/w/cpp/language/type_alias

+0

ありがとう、C + + 11の入力 –

関連する問題