Make setter class type-safe. Eliminated void pointer.

This commit is contained in:
Jens Luedicke
2011-01-22 01:48:21 +01:00
parent a326214482
commit e403394516

View File

@@ -37,23 +37,19 @@ public:
template<typename T> template<typename T>
class setter: public abstract_setter { class setter: public abstract_setter {
public: public:
setter(void *p) explicit setter(T &object)
: ptr(p) { : reference(object) {
BOOST_ASSERT(ptr != 0);
} }
virtual void set_value(const std::string &value) { virtual void set_value(const std::string &value) {
T *ptrT = static_cast<T*>(ptr); reference = string2type::convert<T>(value);
BOOST_ASSERT(ptrT != 0);
*ptrT = string2type::convert<T>(value);
} }
void *ptr; T &reference;
}; };
#define REGISTER_MEMBER(Type, Attribute) \ #define REGISTER_MEMBER(Type, Attribute) \
this->register_setter<Type>(#Attribute, &Attribute); this->register_setter<Type>(#Attribute, this->Attribute);
class settable { class settable {
public: public:
@@ -66,7 +62,7 @@ public:
} }
template<typename T> template<typename T>
void register_setter(const std::string &name, T *ptr) { void register_setter(const std::string &name, T &ptr) {
typedef setter<T> specific_setter; typedef setter<T> specific_setter;
setter_ptr setter(new specific_setter(ptr)); setter_ptr setter(new specific_setter(ptr));