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

标签 c++ qt c++11 macros

我已经编写了一个 QAbstractItemModel 子类,它可以通过 Controller 访问来处理任何数据。 基本上 - Controller 是实际模板化类派生的抽象接口(interface)。为了为 Controller 提供访问功能,我创建了一系列基于 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);

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

有没有办法解决没有宏的原始方法的笨拙问题?

最佳答案

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

我有一些非常相似的代码,我选择使用宏。它们通常不受欢迎,因为它们难以调试、容易出错并且会导致代码膨胀 - 但如果您对宏不会抛出这些问题感到满意,那么在 C++ 中它们没有任何问题。

关于c++ - 泛化模型中的数据访问。避免宏的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15039365/

相关文章:

c++ - 在 Qt 5.7 C++ 中创建简单对象

c++ - Qt:在 Mac OS X 上更改应用程序 QMenuBar 内容

c++ - 替换失败有时是一个错误

c++ - 有没有办法为非整数创建枚举数据类型?

c++ - 我可以将模型中的 bool 转换为 QComboBox 中的是/否吗

c++ - 从 QAbstractItemModel 子类化时支持拖放

c++ - 与 std::future 关联的存储是如何分配的?

c++ - 如果线程涉及互斥锁定和解锁之间的循环,则在 C++ 中的 2 个线程之间切换执行

c++ - 如何在Opencv中访问单 channel IplImage的元素

c++ - '#include' 和 'using' 语句是否应该在头文件和实现文件 (C++) 中重复?