Boost.ParameterをATLで使う

  • ドキュメントが更新された。使い方が少し変わった。完成?
  • _ATL_MIN_CRTを定義していると何も言わずにクラッシュするので注意。


[]#pragma[] []once[]

[]#pragma[] []warning[][]( push )[]
[]#pragma[] []warning[][]( disable : 4100 )[]

[]#ifdef[][] _ATL_MIN_CRT[]
[]#error[] []get_wnd_class_info[] []requires[] []CRT[] []startup[] []code[]
[]#endif[]


[]#ifndef[][] BOOST_PARAMETER_MAX_ARITY[]
[]#define[] []BOOST_PARAMETER_MAX_ARITY[] 17
[]#endif[]

[]#include[][] <boost/parameter/parameters.hpp>[]
[]#include[][] <boost/parameter/keyword.hpp>[]
[]#include[][] <boost/parameter/binding.hpp>[]
[]#include[][] <boost/parameter/macros.hpp>[]
[]#include[][] <boost/parameter/match.hpp>[]

[]#pragma[] []warning[][]( pop )[]

[]namespace[] []ketchup[]
{

[]namespace[] []get_wnd_class_info_parameter[]
{
[]BOOST_PARAMETER_KEYWORD[]([]tag[], []style[])
[]BOOST_PARAMETER_KEYWORD[]([]tag[], []lpfnWndProc[])
[]BOOST_PARAMETER_KEYWORD[]([]tag[], []cbClsExtra[])
[]BOOST_PARAMETER_KEYWORD[]([]tag[], []cbWndExtra[])
[]BOOST_PARAMETER_KEYWORD[]([]tag[], []hInstance[])
[]BOOST_PARAMETER_KEYWORD[]([]tag[], []hIcon[])
[]BOOST_PARAMETER_KEYWORD[]([]tag[], []hCursor[])
[]BOOST_PARAMETER_KEYWORD[]([]tag[], []hbrBackground[])
[]BOOST_PARAMETER_KEYWORD[]([]tag[], []lpszMenuName[])
[]BOOST_PARAMETER_KEYWORD[]([]tag[], []lpszClassName[])
[]BOOST_PARAMETER_KEYWORD[]([]tag[], []hIconSm[])
[]BOOST_PARAMETER_KEYWORD[]([]tag[], []lpszOrigName[])
[]BOOST_PARAMETER_KEYWORD[]([]tag[], []pWndProc[])
[]BOOST_PARAMETER_KEYWORD[]([]tag[], []lpszCursorID[])
[]BOOST_PARAMETER_KEYWORD[]([]tag[], []bSystemCursor[])
} []// namespace get_wnd_class_info_parameter[]

[]namespace[] []detail[]
{
[]typedef[] []boost[]::[]parameter[]::[]parameters[]<
[]get_wnd_class_info_parameter[]::[]tag[]::[]style[],
[]get_wnd_class_info_parameter[]::[]tag[]::[]lpfnWndProc[],
[]get_wnd_class_info_parameter[]::[]tag[]::[]cbClsExtra[],
[]get_wnd_class_info_parameter[]::[]tag[]::[]cbWndExtra[],
[]get_wnd_class_info_parameter[]::[]tag[]::[]hInstance[],
[]get_wnd_class_info_parameter[]::[]tag[]::[]hIcon[],
[]get_wnd_class_info_parameter[]::[]tag[]::[]hCursor[],
[]get_wnd_class_info_parameter[]::[]tag[]::[]hbrBackground[],
[]get_wnd_class_info_parameter[]::[]tag[]::[]lpszMenuName[],
[]get_wnd_class_info_parameter[]::[]tag[]::[]lpszClassName[],
[]get_wnd_class_info_parameter[]::[]tag[]::[]hIconSm[],

[]get_wnd_class_info_parameter[]::[]tag[]::[]lpszOrigName[],
[]get_wnd_class_info_parameter[]::[]tag[]::[]pWndProc[],
[]get_wnd_class_info_parameter[]::[]tag[]::[]lpszCursorID[],
[]get_wnd_class_info_parameter[]::[]tag[]::[]bSystemCursor[]
> []get_wnd_class_info_params[];

[]template[]< []class[] []Wnd[], []class[] []ArgumentPack[] >
[]ATL[]::[]CWndClassInfo[]& []get_wnd_class_info[]([]ArgumentPack[] []const[]& []args[])
{
[]using[] []namespace[] []get_wnd_class_info_parameter[];

[]static[] []ATL[]::[]CWndClassInfo[] []wc[] =
{
{
[]sizeof[]([]WNDCLASSEX[]),
[]args[][ []style[] | ([]UINT[])([]CS_HREDRAW[] | []CS_VREDRAW[] | []CS_DBLCLKS[]) ],
[]args[][ []lpfnWndProc[] | ([]WNDPROC[])[]Wnd[]::[]StartWindowProc[] ],
[]args[][ []cbClsExtra[] | 0 ],
[]args[][ []cbWndExtra[] | 0 ],
[]args[][ []hInstance[] | ([]HINSTANCE[])[]NULL[] ],
[]args[][ []hIcon[] | ([]HICON[])[]NULL[] ],
[]args[][ []hCursor[] | ([]HCURSOR[])[]NULL[] ],
[]args[][ []hbrBackground[] | ([]HBRUSH[])([]COLOR_WINDOW[]+1) ],
[]args[][ []lpszMenuName[] | ([]LPCTSTR[])[]NULL[] ],
[]args[][ []lpszClassName[] | ([]LPCTSTR[])[]NULL[] ],
[]args[][ []hIconSm[] | ([]HCURSOR[])[]NULL[] ]
},
[]args[][ []lpszOrigName[] | ([]LPCTSTR[])[]NULL[] ],
[]args[][ []pWndProc[] | ([]WNDPROC[])[]NULL[] ],
[]args[][ []lpszCursorID[] | ([]LPCTSTR[])[]IDC_ARROW[] ],
[]args[][ []bSystemCursor[] | ([]BOOL[])[]TRUE[] ],
0,
[]_T[]([]""[])
};

[]return[] []wc[];
}
} []// namespace detail[]


[]template[]< []class[] []Wnd[] >
[]ATL[]::[]CWndClassInfo[]& []get_wnd_class_info[]()
{
[]return[] []detail[]::[]get_wnd_class_info[]<[]Wnd[]>([]detail[]::[]get_wnd_class_info_params[]()());
}

[]template[]< []class[] []Wnd[], []class[] []A0[] >
[]ATL[]::[]CWndClassInfo[]& []get_wnd_class_info[]([]A0[] []const[]& []a0[])
{
[]return[] []detail[]::[]get_wnd_class_info[]<[]Wnd[]>([]detail[]::[]get_wnd_class_info_params[]()([]a0[]));
}

[]template[]< []class[] []Wnd[], []class[] []A0[], []class[] []A1[] >
[]ATL[]::[]CWndClassInfo[]& []get_wnd_class_info[]([]A0[] []const[]& []a0[], []A1[] []const[]& []a1[])
{
[]return[] []detail[]::[]get_wnd_class_info[]<[]Wnd[]>([]detail[]::[]get_wnd_class_info_params[]()([]a0[], []a1[]));
}

[]// ...[]