1. 表驱动法
2.问题说明及初步实现
String getKeyValue(String&key){switch(key){case ID1: //这是个整型数据value = String::number(d->id1);break;case ID2: //这个是字串value = String::copy(d->id2);break;…….}return value;}
//表的定义static PropertyTableValue propertyTable[] = {
{ ID1,
TYPE_INT, 0},
{ ID2,
TYPE_STRING, (intptr_t)(void*)malloc(100)},
{ ID_NONE,
TYPE_INT, NULL}};//写值,重载两个函数来实现bool
Settings::setValue(PROPERTY_ID id,
constchar *value)
{
constvoid *pValue =
reinterpret_cast<constvoid*>(value);returnsetValue(id,pValue);
}bool Settings::setValue(PROPERTY_ID id,
int value)
{
int index =
getRowOfProperty(id);if(index==-1 ||
propertyTable[index].type!=TYPE_INT)
returnfalse;propertyTable[index].value = (intptr_t)value;
returntrue;
}
int Settings::getIntValue(PROPERTY_ID id)
{
int index =
getRowOfProperty(id);if(index==-1 ||
propertyTable[index].type!=TYPE_INT)
return0xffffffff;return (int)(propertyTable[index].value);
}
const char* Settings::getStringValue(PROPERTY_ID id)
{
int index =
getRowOfProperty(id);if(index==-1 ||
propertyTable[index].type!=TYPE_STRING)
returnNULL;return reinterpret_cast<constchar *>(propertyTable[index].value);
}
3. 继续优化
template<typename T>
class SettingValue{
~SettingValue(){};
public:
T getValue() {return value;};
bool setValue(T newValue) {
value = newValue; return true;}
private:
T value;};
template <>
bool SettingValue<char *>::setValue(char * newValue)
{
if(value)
{
delete value;
}strcpy(value,newValue);
return true;
}
struct PropertyTableValueV2 {
const PROPERTY_ID key; // property id
const PROPERTY_TYPE type;
//value type
void *value;};static PropertyTableValueV2 propertyTable[] = {
{ ID1,
TYPE_INT, newSettingValue<int>},
{ ID2,
TYPE_STRING, newSettingValue<constchar *>},
{ ID_NONE,
TYPE_INT, NULL}};class SettingsV2 {
public:
template<typename T>
bool setValue(PROPERTY_IDid, T value)
{
SettingValue<T> *vPointer =reinterpret_cast<SettingValue<T> *>(getSettingValueOfProperty(id));
if(!vPointer){
returnfalse;
}
vPointer->setValue(value);
returntrue;
}
template<typename T> T getValue(PROPERTY_IDid)
{
int index =getRowOfProperty(id);
if(index==-1 )
returnNULL;
SettingValue<T> *vPointer =
reinterpret_cast<SettingValue<T> *>(getSettingValueOfProperty(id));
return vPointer->getValue(); }
};
///////[Horky]省略部分代码///////
};
printf("SettingsV2: id1 is %d\n",
(mySetting.getValue<int>(ID1)));
id2 is %s\n",(mySetting.getValue<char
*>(ID2)));
4.进一步优化
5. 关于兼容多参数
template<typename P1,typename P2>
class OperatorWithParameter2 {
public:
typedef
void (*Method)(P1,P2);
typedef
const P1& Param1;
typedef
const P2& Param2;
static
OperatorWithParameter2* create(Method method, Param1 parameter1,Param1 parameter2)
{
return (new
OperatorWithParameter2(method, parameter1,parameter2));
}
private:
OperatorWithParameter2(Method method, Param1 parameter1, Param2 parameter2)
:
m_method(method)
,
m_parameter1(parameter1)
,
m_parameter2(parameter2)
{
}
virtualvoid perform()
{
(*m_method)(m_parameter1,m_parameter2);
}
private:
Method m_method;
P1 m_parameter1;
P2 m_parameter2;};