泛化模型中的数据访问。避免宏的方法?

Posted

技术标签:

【中文标题】泛化模型中的数据访问。避免宏的方法?【英文标题】:Generalizing data access in the model. Way to avoid the macro? 【发布时间】:2013-02-23 10:14:03 【问题描述】:

我编写了一个 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】:

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

我有一些非常相似的代码,我选择使用宏。它们通常不受欢迎,因为它们难以调试,容易出错,并且可能导致代码膨胀 - 但如果你高兴你的宏不会引发这些问题,那么它们在 C++ 中没有任何问题。

【讨论】:

以上是关于泛化模型中的数据访问。避免宏的方法?的主要内容,如果未能解决你的问题,请参考以下文章

L1范数与L2范数正则化

服务访问质量 QOS

SharePoint服务器端对象模型 之 使用LINQ进行数据访问操作(Part 4)

ADO.Net创建数据模型和数据访问类及泛型集合

如何从辅助函数访问模型以查询数据库?

笔记25 传递模型数据到视图中