2017-03-16 10 views
0

これをアップグレードすることは可能ですか?forforループをC++ 11スタイルにアップグレードする

hItem = m_treeHistory.InsertItem(TVIF_TEXT|TVIF_PARAM, 
      strText, 0, 0, 0, 0, (LPARAM)psAssign, TVI_ROOT, TVI_LAST); 
if (psAssign->aryPtrAssignments.GetSize() > 0) 
{ 
    iSize = psAssign->aryPtrAssignments.GetSize(); 
    for (i = 0; i < iSize; i++) 
    { 
     psAssignHist = (HIST_DATA_ASSIGN_S *)psAssign->aryPtrAssignments[i]; 
     if (psAssign != nullptr) 
     { 
      strText = psAssignHist->datAssignment.Format(VAR_DATEVALUEONLY); 
      if (psAssignHist->strMethod != _T("")) 
      { 
       strText += _T(" - "); 
       strText += psAssignHist->strMethod; 
      } 
      if (psAssignHist->strTheme != _T("")) 
      { 
       strText += _T(" - "); 
       strText += psAssignHist->strTheme; 
      } 

      // AJT v10.7.0 
      if (strFilterText == _T("") || IsFilteredMatch(psAssignHist)) 
      { 
       m_treeHistory.InsertItem(TVIF_TEXT|TVIF_PARAM, 
        strText, 0, 0, 0, 0, (LPARAM)psAssignHist, hItem, TVI_LAST); 
      } 
     } 
    } 
    tvs.hParent = hItem; 
    tvs.lParam = (LPARAM)&m_treeHistory; 
    tvs.lpfnCompare = CompareDateAssignHistory; 
    m_treeHistory.SortChildrenCB(&tvs); 
} 

それはこのforループです:私はhereを見ていると、それが示唆

iSize = psAssign->aryPtrAssignments.GetSize(); 
for (i = 0; i < iSize; i++) 
{ 

for(int i: someDataStructure) doSomething(); 

をしかし、私は私が私のpsAssign->aryPtrAssignmentsリストそのためにこれを採用することができるかどうかわかりませんCPtrArrayHIST_DATA_ASSIGN_Sポインターです。

ありがとうございます。

答えて

2

ranged for loopは、CPtrArrayのために存在しない標準ライブラリイテレータ(すなわち、beginおよびend関数)に依存します。

幸運なことに、特殊容器を扱うためにbeginend関数を作成することができます。これらはグローバルな非メンバ関数でなければならないこと

void** begin(CPtrArray const& arr) 
{ 
    return arr.GetData(); 
} 

void** end(CPtrArray const& arr) 
{ 
    return arr.GetData() + arr.GetSize(); 
} 

ノートのようなおそらく何か。ここで紹介するbeginend機能がのためのイテレータを期待し、すべてのの標準機能を使用することができることを

CPtrArray myArray; 

// Code to populate myArray 

for (auto ptr : myArray) 
{ 
    // Do something with the pointer ptr 
} 

注:

現在、これらのヘルパー関数を使用すると、遠隔forループを使用することができるはずです。

+0

これらの 'begin'と' end'メソッドはどのように 'for'ループによって呼び出されますか? –

+1

@AndrewTruckle通常の関数と同様に、引数として配列(私の例ではmyA​​rray)を渡します。ループの同等のコードの例を含むリファレンスの私の答えのリンクに従ってください。 –

+0

私は参照してください。ですから、実際には、それらのメソッドを持つ独自の 'CPtrArrayEx'クラスを作成し、代わりに** my **配列を' CPtrArrayEx'から派生させることを提案しています。私は反復方法を修正することができます。そうですか。最終的な論理的な質問は、そのような変更を行う価値があるかどうかです。 –

関連する問題