Code1
# include
# include
using namespace STD; void inner (string &) {cout <"inner (string &)"
void outer (T & T) {inner (t);} template
void outer (const T & T) {inner (t );} string strange () {return "Strange ()" ;}const string charm () {return "charm ()" ;}int main () {string up ("up "); const string down ("down"); cout <"directly calling inner (). "
Code 2
# Include <iostream> # include <ostream> # include <string> using namespace STD; Template <typename T> struct name; template <> struct name <string> {static const char * Get () {return "string ";}}; template <> struct name <const string> {static const char * Get () {return "const string ";}}; template <> struct name <string & >{ static const char * Get () {return "string &";}}; template <> struct name <const string &> {static const char * Get () {return "const string &";}}; template <> struct name <string &> {static const char * Get () {return "string &&";}}; template <> struct name <const string &> {static const char * Get () {return "const string &&";}}; template <typename T> void Quark (T & T) {cout <"T:" <t <Endl; cout <"t: "<name <t>: Get () <Endl; cout <" T &: "<name <t &>: Get () <Endl; cout <Endl;} string strange () {return "Strange ()" ;}const string charm () {return "charm ()";} int main () {string up ("up"); const string down ("down"); Quark (up); Quark (down); Quark (strange ()); quark (charm ();} // T: Up // T: string & // T &: string & // T: Down/T: const string & // T &: const string & // T: Strange () // T: String // T &&: string & // T: charm () // T: const string // T &: const string &&
code 3
# Include <iostream >#include <string> using namespace STD; Template <typename T> struct identity {typedef T type ;}; template <typename T> T & forward (typename identity <t >:: type & T) {return static_cast <t &> (t);} void inner (string &) {cout <"inner (string &)" <Endl;} void inner (const string &) {cout <"inner (const string &)" <Endl ;} void inner (string &) {cout <"inner (string &)" <Endl;} void inner (const string &&) {cout <"inner (const string &)" <Endl ;}template <typename T> void outer (T & T) {inner (Forward <t> (t);} string strange () {return "Strange ()" ;}const string charm () {return "charm ()";} int main () {string up ("up"); const string down ("down"); cout <"directly calling inner (). "<Endl; Inner (up); Inner (down); Inner (strange (); Inner (charm ()); cout <Endl <"calling outer (). "<Endl; outer (up); outer (down); outer (strange (); outer (charm ();} // directly calling inner (). // inner (string &) // inner (const string &&) //// calling outer (). // inner (string &) // inner (const string &&)