我编写了一个 QAbstractItemModel 子类,它可以通过控制器访问处理任何数据。基本上 - 控制器是实际模板类派生的抽象接口。为了为控制器提供访问功能,我正在创建一系列基于 lambda 的 getter/setter,例如:
holder->AddGetter(QPair<int,int>(0,0),
[] (const Builtin* data)
{
if(data)
return QVariant(data->uml);
else
return QVariant();
}
);
holder->AddSetter(QPair<int,int>(0,0),
[] (Builtin* data, QVariant value)
{
if(data)
data->uml = value.toString();
}
);
holder->AddGetter(QPair<int,int>(1,0),
[] (const Builtin* data)
{
if(data)
return QVariant(data->cpp);
else
return QVariant();
}
);
holder->AddSetter(QPair<int,int>(1,0),
[] (Builtin* data, QVariant value)
{
if(data)
data->cpp= value.toString();
}
);
....
holder->AddGetter(QPair<int,int>(N,0),
[] (const Builtin* data)
....
这确实解决了泛化问题,但在代码中看起来非常丑陋且难以使用,所以我不得不创建一个宏:
#define ADD_STRING_GETSET(X,Y,Z) \
X->AddGetter(QPair<int,int>(Y,0), \
[] (const Builtin* data) \
{ \
if(data) \
return QVariant(data->Z); \
else \
return QVariant(); \
} \
); \
X->AddSetter(QPair<int,int>(Y,0), \
[] (Builtin* data, QVariant value) \
{ \
if(data) \
data->Z = value.toString(); \
} \
); \
现在我可以写:
ADD_STRING_GETSET(holder, 0, firstParam);
....
ADD_STRING_GETSET(holder, N, NthParam);
但是......好吧,这是一个宏......
有没有办法在没有宏的情况下解决原始方法的笨拙问题?