概要
CArray, CStringArray といったMFCコンテナは過去との互換性のために残されているものの、今後 begin, end といったメンバ関数が追加される見込みは限りなく低い。
だが自前で std::begin, std::end グローバル関数を適切に定義すると拡張 for 文を使うことができる。
方法
どっか見えるところに以下のように std::begin, std::end 関数を定義しておきます(begin と end の帳尻が合っていれば関数の中身は何でもいいです)。
namespace std
{
template<class T>
T* begin(CArray<T>& _Cont)
{
return (&_Cont.GetAt(0));
}
template<class T>
T* end(CArray<T>& _Cont)
{
T* last = &_Cont.GetAt(_Cont.GetSize() - 1);
return (last + 1);
}
CString* begin(CStringArray& _Cont)
{
return (&_Cont[0]);
}
CString* end(CStringArray& _Cont)
{
CString* last = &_Cont[_Cont.GetSize() - 1];
return (last + 1);
}
}
そうすると以下のように拡張 for 文が使えます。
cout << "=== Loop CArray ===" << endl;
CArray<int> arr;
arr.Add(1);
arr.Add(2);
arr.Add(3);
arr.Add(4);
// CArray を拡張 for で回す
for (int& v : arr) { cout << v << endl; }
cout << "\n=== Loop CStringArray ===" << endl;
wcout.imbue(std::locale(""));
CStringArray sarr;
sarr.Add(_T("hello, "));
sarr.Add(_T("world"));
// CStringArray を拡張 for で回す
for (CString& s : sarr) { wcout << (LPCTSTR)s << endl; }
Console出力
=== Loop CArray ===
1
2
3
4
=== Loop CStringArray ===
hello,
world
以上。