Make setter class type-safe. Eliminated void pointer.
This commit is contained in:
16
settable.hpp
16
settable.hpp
@@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user