コンパイルタイム・ポリモーフィズム
- 前日分を少し実践的に書き直しました
- 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[]
[]}[]