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

  • 前日分を少し実践的に書き直しました
  • VC6からComeauまで動きます
  • おそらくこれがC++ポリモーフィズムの答えであると思われる
    • Boost.Rangeはあのままではまずいと思う
  • Boost.Serializationではoverloadedの部分がconst unsigned int versionになっていて、version番号、VC6の不具合の回避、2nd phase ADL、の三つの役割を持っている!


[]#include[] []<boost/config.hpp>[] []// for BOOST_NO_FUNCTION_TEMPLATE_ORDERING[]
[]#include[] []<boost/pfto.hpp>[]
[]#include[] []<boost/strong_typedef.hpp>[]

[]namespace[] []poost[][] {[]

[]// See: <boost/serialization/serialization.hpp>[]

[]namespace[] []xxx_overload_set[][] {[]

[]typedef[] []int[] []overloaded[][]; [][]// nicely named for users[]
[]BOOST_STRONG_TYPEDEF[][]([][]overloaded[][], [][]adl_trigger_type[][]) [][]// ADL trigger[]

[]////////////////////////////////////////////////////////////////////////////////[]
[]// library-defined []
[]// BOOST_PFTO works only if overloads are in the same namespace.[]
[]//[]
[]template[][]< [][]class[] []T[][] > [][]// default[]
[]void[] []poost_xxx[][]([][]T[][]&, [][]BOOST_PFTO[] []overloaded[][])[]
[] {[]
[]POOST_PRINT[][]([][]default[] []poost[][]::[][]xxx[][]);[]
[] }[]

[]inline[] []void[] []poost_xxx[][]([][]char[][], [][]overloaded[][])[]
[] {[]
[]POOST_PRINT[][]([][]poost[][]::[][]xxx[][]([][]char[][]));[]
[] }[]

[]template[][]< [][]class[] []T[][] >[]
[]void[] []poost_xxx[][]([][]std[][]::[][]list[][]<[][]T[][]>&, [][]overloaded[][])[]
[] {[]
[]POOST_PRINT[][]([][]poost[][]::[][]xxx[][]([][]std[][]::[][]list[][]<>&));[]
[] }[]

[] } [][]// namespace xxx_overload_set[]

[]template[][]< [][]class[] []T[][] >[]
[]void[] []xxx[][]([][]T[][]& [][]x[][])[]
[] {[]
[]using[] []namespace[] []xxx_overload_set[][];[]

[]#if[][] !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)[]
[]adl_trigger_type[] []trigger[][]([][]0[][]);[]
[]poost_xxx[][]([][]x[][], [][]trigger[][]);[]
[]#else[]
[]overloaded[] []pfto[][]([][]0[][]);[]
[]poost_xxx[][]([][]x[][], [][]pfto[][]);[]
[]#endif[]
[] }[]

[]} [][]// namespace poost[]

[]// An important function[]
[]template[][]< [][]class[] []T[][] >[]
[]void[] []yyy[][]([][]T[][]& [][]x[][])[]
[]{[]
[]poost[][]::[][]xxx[][]([][]x[][]);[]
[]// ...[]
[]}[]

[]// user-defined customization[]
[]namespace[] []poost[][] { [][]namespace[] []xxx_overload_set[][] {[]

[]inline[] []void[] []poost_xxx[][]([][]int[][], [][]overloaded[][])[]
[] {[]
[]POOST_PRINT[][]([][]poost[][]::[][]xxx[][]([][]int[][]));[]
[] }[]

[]template[][]< [][]class[] []T[][] >[]
[]void[] []poost_xxx[][]([][]std[][]::[][]vector[][]<[][]T[][]>&, [][]overloaded[][])[]
[] {[]
[]POOST_PRINT[][]([][]poost[][]::[][]xxx[][]([][]std[][]::[][]vector[][]<>&));[]
[] }[]

[]} } [][]// namespace poost::xxx_overload_set[]

[]void[] []test[][]()[]
[]{[]
[]int[] []i[][];[]
[] ::[][]yyy[][]([][]i[][]);[]

[]std[][]::[][]vector[][]<[][]int[][]> [][]vec[][];[]
[] ::[][]yyy[][]([][]vec[][]);[]

[]std[][]::[][]list[][]<[][]int[][]> [][]lst[][];[]
[] ::[][]yyy[][]([][]lst[][]);[]

[]char[] []ch[][];[]
[] ::[][]yyy[][]([][]ch[][]);[]

[]std[][]::[][]string[] []str[][];[]
[] ::[][]yyy[][]([][]str[][]); [][]// default[]
[]}[]