首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

大寨版C++Builder属性-用模板类实现

2012-06-20 
山寨版C++Builder属性--用模板类实现山寨版C++Builder属性使用上比cbuilder的稍麻烦点,效率也没cbuilder本

山寨版C++Builder属性--用模板类实现
山寨版C++Builder属性
使用上比cbuilder的稍麻烦点,效率也没cbuilder本身的属性效率高
用模板类实现的,比较通用点。
大家帮忙看看有没有错误,在效率上还能不能优化一些。
例子在mingw,cb2010都正常。只要不是比较老的c++编译器都能正常编译。我没有vc6.0,不保证能编译。
property模板类没有100%都测试,有点多


属性模板类

C/C++ code
 
// property.hpp
// 属性模板类,南果梨,cnhemiya@gmail.com
// 有更好的方法和错误修改,希望能给我发一份,谢谢:)
#ifndef PROPERTY_HPP_INCLUDED
#define PROPERTY_HPP_INCLUDED


namespace property_ns
{

// r = read, w = write, v = value, f = function, a = array
enum read_write { rw_rv, rw_rf, rw_ra, rw_wv, rw_wf, rw_wa, rw_rv_wv, rw_rf_wf, rw_rv_wf, rw_rf_wv, rw_ra_wa };
enum read_write_value { };
enum flag { flag_1 = 1, flag_2, flag_3, flag_4, flag_5, flag_6 };

}


template <typename ValueT, property_ns::read_write, typename ClassT = property_ns::read_write_value>
class property
{

};

// 只读值
// 声明:property <ValueT, property_ns::rw_rv> pr
// 初始化: pr(value_name)
template <typename ValueT>
class property <ValueT, property_ns::rw_rv>
{
public:
property(ValueT &val) : m_object(val) { }

operator const ValueT() const
{
return m_object;
}

private:
ValueT &m_object;
};

// 只读函数
// 声明:property <ValueT, property_ns::rw_rf, ClassT> pr
// 初始化:pr(&class_name::get_name, this)
// 读函数声明:ValueT get_name() const
// 读函数声明:ValueT get_name()
// 读函数声明:const ValueT & get_name() const
// 读函数声明:const ValueT & get_name()
// 读函数声明:const ValueT get_name() const
// 读函数声明:const ValueT get_name()
template <typename ValueT, typename ClassT>
class property <ValueT, property_ns::rw_rf, ClassT>
{
typedef ValueT (ClassT::*RFunc1)() const;
typedef ValueT (ClassT::*RFunc2)();
typedef const ValueT & (ClassT::*RFunc3)() const;
typedef const ValueT & (ClassT::*RFunc4)();
typedef const ValueT (ClassT::*RFunc5)() const;
typedef const ValueT (ClassT::*RFunc6)();

public:
property(RFunc1 func, ClassT *cp) : m_rfunc1(func), m_cp(cp), m_r_flag(property_ns::flag_1) { }
property(RFunc2 func, ClassT *cp) : m_rfunc2(func), m_cp(cp), m_r_flag(property_ns::flag_2) { }
property(RFunc3 func, ClassT *cp) : m_rfunc3(func), m_cp(cp), m_r_flag(property_ns::flag_3) { }
property(RFunc4 func, ClassT *cp) : m_rfunc4(func), m_cp(cp), m_r_flag(property_ns::flag_4) { }
property(RFunc5 func, ClassT *cp) : m_rfunc5(func), m_cp(cp), m_r_flag(property_ns::flag_5) { }
property(RFunc6 func, ClassT *cp) : m_rfunc6(func), m_cp(cp), m_r_flag(property_ns::flag_6) { }

operator const ValueT() const
{
switch (m_r_flag)
{
case property_ns::flag_1:
return (m_cp->*m_rfunc1)();
case property_ns::flag_2:
return (m_cp->*m_rfunc2)();
case property_ns::flag_3:
return (m_cp->*m_rfunc3)();
case property_ns::flag_4:
return (m_cp->*m_rfunc4)();
case property_ns::flag_5:
return (m_cp->*m_rfunc5)();
case property_ns::flag_6:
;
default:
return (m_cp->*m_rfunc6)();
}
}

private:
RFunc1 m_rfunc1;
RFunc2 m_rfunc2;
RFunc3 m_rfunc3;
RFunc4 m_rfunc4;
RFunc5 m_rfunc5;
RFunc6 m_rfunc6;

ClassT *m_cp;
short m_r_flag;
};

// 只读函数,数组
// 声明:property <ValueT, property_ns::rw_ra, ClassT> pr
// 初始化:pr(&class_name::get_name, this)
// 读函数声明:ValueT get_name(int) const
// 读函数声明:ValueT get_name(int)
// 读函数声明:const ValueT & get_name(int) const
// 读函数声明:const ValueT & get_name(int)


// 读函数声明:const ValueT get_name(int) const
// 读函数声明:const ValueT get_name(int)
template <typename ValueT, typename ClassT>
class property <ValueT, property_ns::rw_ra, ClassT>
{
typedef ValueT (ClassT::*RFunc1)(int) const;
typedef ValueT (ClassT::*RFunc2)(int);
typedef const ValueT & (ClassT::*RFunc3)(int) const;
typedef const ValueT & (ClassT::*RFunc4)(int);
typedef const ValueT (ClassT::*RFunc5)(int) const;
typedef const ValueT (ClassT::*RFunc6)(int);

public:
property(RFunc1 func, ClassT *cp) : m_rfunc1(func), m_cp(cp), m_r_flag(property_ns::flag_1) { }
property(RFunc2 func, ClassT *cp) : m_rfunc2(func), m_cp(cp), m_r_flag(property_ns::flag_2) { }
property(RFunc3 func, ClassT *cp) : m_rfunc3(func), m_cp(cp), m_r_flag(property_ns::flag_3) { }
property(RFunc4 func, ClassT *cp) : m_rfunc4(func), m_cp(cp), m_r_flag(property_ns::flag_4) { }
property(RFunc5 func, ClassT *cp) : m_rfunc5(func), m_cp(cp), m_r_flag(property_ns::flag_5) { }
property(RFunc6 func, ClassT *cp) : m_rfunc6(func), m_cp(cp), m_r_flag(property_ns::flag_6) { }

const ValueT operator [](int i) const
{
switch (m_r_flag)
{
case property_ns::flag_1:
return (m_cp->*m_rfunc1)(i);
case property_ns::flag_2:
return (m_cp->*m_rfunc2)(i);
case property_ns::flag_3:
return (m_cp->*m_rfunc3)(i);
case property_ns::flag_4:
return (m_cp->*m_rfunc4)(i);
case property_ns::flag_5:
return (m_cp->*m_rfunc5)(i);
case property_ns::flag_6:
;
default:
return (m_cp->*m_rfunc6)(i);
}
}

private:
RFunc1 m_rfunc1;
RFunc2 m_rfunc2;
RFunc3 m_rfunc3;
RFunc4 m_rfunc4;
RFunc5 m_rfunc5;
RFunc6 m_rfunc6;

ClassT *m_cp;
short m_r_flag;
};

// 只写值
// 声明:property <ValueT, property_ns::rw_wv> pr
// 初始化:pr(value_name)
template <typename ValueT>
class property <ValueT, property_ns::rw_wv>
{
public:
property(ValueT &val) : m_object(val) { }

void operator =(const ValueT &val)
{
m_object = val;
}

private:
ValueT &m_object;
};

// 只写函数
// 声明:property <ValueT, property_ns::rw_wf, ClassT> pr
// 初始化:pr(&class_name::set_name, this)
// 写函数声明:void set_name(ValueT)
// 写函数声明:void set_name(const ValueT &)
template <typename ValueT, typename ClassT>
class property <ValueT, property_ns::rw_wf, ClassT>
{
typedef void (ClassT::*WFunc1)(ValueT);
typedef void (ClassT::*WFunc2)(const ValueT &);

public:
property(WFunc1 wfunc, ClassT *cp) : m_wfunc1(wfunc), m_cp(cp), m_w_flag(property_ns::flag_1) { }
property(WFunc2 wfunc, ClassT *cp) : m_wfunc2(wfunc), m_cp(cp), m_w_flag(property_ns::flag_2) { }

void operator =(const ValueT &val)
{
m_w_flag == property_ns::flag_1 ? (m_cp->*m_wfunc1)(val) : (m_cp->*m_wfunc2)(val);
}

private:
WFunc1 m_wfunc1;
WFunc2 m_wfunc2;

ClassT *m_cp;
short m_w_flag;
};

// 只写函数,数组
// 声明:property <ValueT, property_ns::rw_wa, ClassT> pr
// 初始化:pr(&class_name::set_name, this)
// 写函数声明:ValueT & set_name(int)
template <typename ValueT, typename ClassT>
class property <ValueT, property_ns::rw_wa, ClassT>
{
typedef ValueT & (ClassT::*WFunc)(int);

public:
property(WFunc wfunc, ClassT *cp) : m_wfunc(wfunc), m_cp(cp) { }

ValueT & operator [](int i)
{
return (m_cp->*m_wfunc)(i);


}

private:
WFunc m_wfunc;

ClassT *m_cp;
};



[解决办法]
好象這樣走,有些歪門斜道的樣子。

屬性實現為一個模板類,
AClass.property_A = BClass.property_B
也就是 a.num = b.num 這樣的不同類之間的屬性相互賦值,上面的代碼應該沒實現。

感覺這樣走下去,路不是越走越寬,而是因為各種限制,會越走越受限制。

[解决办法]
读高人代码,不走歪门邪道
[解决办法]
楼主钻研精神可嘉。
[解决办法]
事件准备怎么实现?
[解决办法]
南果梨很好很强大,支持啊~~
不过如果事件用boost的signal实现的话,__closure关键字也得用function/bind来实现了,这样的话估计和VCL的使用习惯会相差比较大。呵呵,不过更加C++一点。

热点排行