LoginSignup
5
6

More than 5 years have passed since last update.

MFCの CArray や CStringArray を拡張 for 文で回す

Posted at

概要

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

以上。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6