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){
return
false;
}
vPointer->setValue(value);
return
true;
}
template<typename T> T getValue(PROPERTY_IDid)
{
int index =
getRowOfProperty(id);
if(index==-1 )
return
NULL;
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;};