在模型中概括数据访问。避免宏的方法?

时间:2013-02-23 10:14:03

标签: c++ qt c++11 macros

我编写了一个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);

但是......好吧,这是一个宏......

有没有办法在没有宏的情况下解决原始方法的笨拙?

1 个答案:

答案 0 :(得分:1)

你必须将一个指向成员的函数或另一个lambda传递给替换函数才能访问NthParam - 这就像丑陋一样。

我有一些非常相似的代码,我选择使用宏。他们通常不赞成,因为他们很难调试,容易出错,并且可能导致代码膨胀 - 但如果你开心你的宏不会抛出这些问题,那么在C ++中它们没有任何问题。