0

コントローラアクセスを介して任意のデータを処理するQAbstractItemModelサブクラスを作成しました。基本的に-コントローラーは、実際のテンプレートクラスが派生する抽象インターフェイスです。コントローラにアクセス機能を提供するために、次のような一連のラムダベースのゲッター/セッターを作成しています。

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);

しかし...まあ、それはマクロです...

マクロなしで元のアプローチの扱いにくいものを解決する方法はありましたか?

4

1 に答える 1

1

-にアクセスするには、メンバーへのポインタ関数または別のラムダを置換関数に渡す必要がありますNthParam。これも同様に醜いです。

非常によく似たコードがいくつかあり、マクロを使用することを選択しました。これらは、デバッグが難しく、間違えやすく、コードの膨張を引き起こす可能性があるため、一般的に眉をひそめています。ただし、マクロでこれらの問題が発生しない場合は、C++で問題はありません。

于 2013-02-23T10:23:34.900 に答える