コンパイルタイム・ポリモーフィズム再び

  • 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[]
[]*/[]