//cpp/linenumber #include <iostream> struct point_tag {}; struct vector_tag {}; struct Point { typedef point_tag type; }; struct Vector { typedef vector_tag type; }; // Point用 print void print_(const Point& target, point_tag) { std::cout << "Point\n"; } // Vector用 print void print_(const Vector& target, vector_tag) { std::cout << "Vector\n"; } // Point/Vector用print template <typename Arg> void print( const Arg &x ) { print_( x, typename Arg::type() ); // Arg::type で上記のどっちかに振り分ける } int main() { Point p; Vector v; print(p); print(v); }