コンパイルタイム・ポリモーフィズム再び
- Boost.Foreachが見せてくれた・・・参照
- ADLのための関数はどうせフルネームなのだからグローバル名前空間を使えばいいということだ
- Boost.Foreachではenumを使っているが移植性の問題かもしれない
- 以下、eVC4, VC7, VC8, GCC3.4.4で動作確認
[]#include[] []<string>[]
[]#include[] []<boost/config.hpp>[]
[]#include[] []<pstade/print.hpp>[]
[]struct[] []pstade_overloaded[]
[]{ };[]
[]namespace[] []graphics[][] {[]
[]template[][]< [][]class[] []ShapeT[][] >[]
[]void[] []draw[][]([][]ShapeT[][]& [][]x[][])[]
[] {[]
[]graphics_draw[][]([][]x[][], [][]pstade_overloaded[][]());[]
[] }[]
[]} [][]// namespace graphics[]
[]template[][]< [][]class[] []ShapeT[][] >[]
[]void[] []graphics_draw[][]([][]ShapeT[][]&, ...)[]
[]{[]
[]pstade[][]::[][]print[][]([][]"graphics_draw default"[][]);[]
[]}[]
[]class[] []Line[]
[]{ };[][]inline[] []void[] []graphics_draw[][]([][]Line[][]&, [][]pstade_overloaded[][])[]
[]{[]
[]pstade[][]::[][]print[][]([][]"graphics_draw(Line&)"[][]);[]
[]}[]
[]namespace[] []crop[][] {[]
[]class[] []Circle[]
[] { };[][]#if[][] !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)[]
[]inline[] []void[] []graphics_draw[][]([][]Circle[][]&, [][]pstade_overloaded[][])[]
[] {[]
[]pstade[][]::[][]print[][]([][]"graphics_draw(Circle&)"[][]);[]
[] }[]
[]#endif[][]} [][]// namespace crop[]
[]#if[][] defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)[]
[]inline[] []void[] []graphics_draw[][]([][]crop[][]::[][]Circle[][]&, [][]pstade_overloaded[][])[]
[]{[]
[]pstade[][]::[][]print[][]([][]"graphics_draw(Circle&)"[][]);[]
[]}[]
[]#endif[]
[]namespace[] []never_open[][] {[]
[]template[][]< [][]class[] []CharT[][] >[]
[]class[] []Text[]
[] { };[]
[]} [][]// namespace never_open[][]template[][]< [][]class[] []CharT[][] >[]
[]void[] []graphics_draw[][]([][]never_open[][]::[][]Text[][]<[][]CharT[][]>&, [][]pstade_overloaded[][])[]
[]{[]
[]pstade[][]::[][]print[][]([][]"graphics_draw(Text<T>&)"[][]);[]
[]}[]
[]inline[] []void[] []graphics_draw[][]([][]float[][]&, [][]pstade_overloaded[][])[]
[]{[]
[]pstade[][]::[][]print[][]([][]"graphics_draw(float&)"[][]); []
[]}[]
[]void[] []test_overloaded[][]()[]
[]{[]
[]pstade[][]::[][]print[][]([][]"overloaded..."[][]);[][]Line[] []l[][];[]
[]graphics[][]::[][]draw[][]([][]l[][]);[]
[]crop[][]::[][]Circle[] []c[][];[]
[]graphics[][]::[][]draw[][]([][]c[][]);[]
[]never_open[][]::[][]Text[][]<[][]char[][]> [][]t[][];[]
[]graphics[][]::[][]draw[][]([][]t[][]);[][]float[] []f[][];[]
[]graphics[][]::[][]draw[][]([][]f[][]);[]
[]std[][]::[][]string[] []s[][];[]
[]graphics[][]::[][]draw[][]([][]s[][]);[]
[]}[][]/* outputs...[]
[]graphics_draw(Line&)[]
[]graphics_draw(Circle&)[]
[]graphics_draw(Text<T>&)[]
[]graphics_draw(float&)[]
[]graphics_draw default[]
[]*/[]