C ++のプロパティに触発
5分間の思考で、プリプロセッサディレクティブなしで行う方法、何かが現れました...
この「何か」が役立つか、怠inessを理解できるか。 多くの欠点があり、名前によるアクセスはありませんが、マクロはありません)
up :getter-setter-クラスメソッドによって作成
#include <string> #include <map> #include <iostream> using namespace std; template<class B,class T> class DefineProperty { T value; B *that; typedef void (B::*SetterPtr)(const T&); typedef T (B::*GetterPtr)(const T&) const; void (B::*setter)( const T &val ); T (B::*getter)( const T &val ) const; public: DefineProperty() { setter = NULL; getter = NULL; that = NULL; } DefineProperty(B *self, GetterPtr get, SetterPtr set) { that = self; setter = set; getter = get; } DefineProperty(B *self, SetterPtr set, GetterPtr get) { that = self; setter = set; getter = get; } DefineProperty(B *self, GetterPtr get) { that = self; setter = NULL; getter = get; } DefineProperty(B *self, SetterPtr set) { that = self; setter = set; getter = NULL; } void operator = ( const T &val ) { set( val ); } void set( const T &val ) { value = val; if( setter ) (that->*setter)( val ); } operator T () const { return get(); } T get() const { if( getter ) return (that->*getter)(value); return value; } T field_get() const { return value; } void field_set( const T &val ) { value = val; } }; template<class T,class B> std::ostream& operator<<(std::ostream &out, const DefineProperty<T,B> &val) { out << (val.get()); return out; } class ClassWithProps { public: DefineProperty<ClassWithProps,int> Integer; DefineProperty<ClassWithProps,int> PlainInteger; DefineProperty<ClassWithProps,int> FakedInteger; DefineProperty<ClassWithProps,string> String;