C++でPropertyつづき
前のエントリーに上書きしちゃったみたいです。汗
Boost.Propertyの実装案みたいなもの->http://codepad.org/A4vaAMPZ
これみて簡単にならないかやってみました。
#include <boost/typeof/typeof.hpp> #include <iostream> template<typename T> struct property_get_type; template<typename ReturnType,typename Class> struct property_get_type<ReturnType (Class::*)() const> { typedef ReturnType type; }; template<typename T> struct property_set_type; template<typename ReturnType,typename Class,typename Argument> struct property_set_type<ReturnType (Class::*)(Argument)> { typedef Argument type; }; template <class Signeture> class signeture { typedef BOOST_TYPEOF_TPL(&Signeture::get) get_signeture_type; typedef BOOST_TYPEOF_TPL(&Signeture::set) set_signeture_type; public: typedef typename property_get_type<get_signeture_type>::type get_return_type; typedef typename property_set_type<set_signeture_type>::type set_argument_type; }; #define MY_PROPERTY(Property, Class) \ struct Property## _ ##Class : public signeture<Property>, public Property \ { \ typedef Property base_type; \ get_return_type get() const { return static_cast<const base_type*>(this)->get(); } \ void set(set_argument_type v) { static_cast<base_type*>(this)->set(v); } \ Property## _ ##Class & operator=(set_argument_type v) { set(v); return *this; } \ operator get_return_type () { return get(); } \ } \ class my_class { struct my_property { double get() const { return arg_; } void set(double v) { arg_ = v; } private: double arg_; }; public: MY_PROPERTY(my_property, my_class) value; }; int main() { my_class m; m.value = 5; double xx = m.value; return 0; }
self()で自分のポインタ取り出せなくなりました。orz
boost恐るべし・・・。