#pragma once #include <string> using namespace std; class Action { public: virtual string CanDo() = 0 ; }; class Fly : public Action { public: string fly() {return "Fly";} virtual string CanDo() {return fly();} }; class Run : public Action { public: string run() {return "Run";} virtual string CanDo() {return run();} }; class Walk : public Action { public: string walk() {return "Walk";} virtual string CanDo() {return walk();} }; class Jump : public Action { public: string jump() {return "Jump";} virtual string CanDo() {return jump();} }; class Talk : public Action { public: string talk() {return "Talk";} virtual string CanDo() {return talk();} }; template<class T> class _Create { public: string CanDo() {return type.CanDo();} private: T type; }; template <> class _Create<void /*Action*/> // Action Okay also { public: string CanDo() {return "";} // Do nothing }; template<class T1 = void /*Action*/, // Action Okay also class T2 = void /*Action*/, class T3 = void /*Action*/, class T4 = void /*Action*/, class T5 = void /*Action*/, class T6 = void /*Action*/, class T7 = void /*Action*/, class T8 = void /*Action*/> class Create { public: string CanDo() { string strResult = ""; strResult += parm1.CanDo().empty()? "":parm1.CanDo() + ","; strResult += parm2.CanDo().empty()? "":parm2.CanDo() + ","; strResult += parm3.CanDo().empty()? "":parm3.CanDo() + ","; strResult += parm4.CanDo().empty()? "":parm4.CanDo() + ","; strResult += parm5.CanDo().empty()? "":parm5.CanDo() + ","; strResult += parm6.CanDo().empty()? "":parm6.CanDo() + ","; strResult += parm7.CanDo().empty()? "":parm7.CanDo() + ","; strResult += parm8.CanDo().empty()? "":parm8.CanDo() + ","; return strResult; } Create<T1, T2, T3, T4,T5,T6,T7,T8>* Clone() { Create<T1, T2, T3, T4,T5,T6,T7,T8>* p = new Create<T1, T2, T3, T4,T5,T6,T7,T8>; *p = *this; return p; } private: _Create<T1> parm1; _Create<T2> parm2; _Create<T3> parm3; _Create<T4> parm4; _Create<T5> parm5; _Create<T6> parm6; _Create<T7> parm7; _Create<T8> parm8; }; int _tmain(int argc, _TCHAR* argv[]) { Create<Fly> create1; cout << create1.CanDo() << endl; Create<Fly, Run, Jump> create2; cout << create2.CanDo() << endl; Create<Fly, Run, Jump, Jump, Run, Fly, Run, Talk> create3; cout << create3.CanDo() << endl; return 0; } 相关链接: http://blog.csdn.net/BlueDog/archive/2009/10/22/4715542.aspx