1

現在、マクロを使用して set および get 関数を使用して基本クラスを作成しています。しかし、もっと複雑なマクロを追加したいのですが、マクロはデバッグに非常に悪いので、テンプレートを使ってやりたいのですが、誰かが本やリンクを知っているかどうかわかりません。

私の本当の問題ははるかに複雑です。セットを作成し、問題を示す例を取得しました。

簡単な例として、次を参照してください。

#include <iostream>

#define SETGET_BEGIN(name) \
  class name##Base { \
  public: name##Base(){};

#define SETGET_VAR(type,name) \
  protected: type name##_; \
  public: void set##name(const type &_r) {name##_ = _r;} ; \
  public: const type &get##name() const {return name##_; };  \

#define SETGET_END };

SETGET_BEGIN(MyClass)
SETGET_VAR(int,NrA)
SETGET_VAR(float,NrB)
SETGET_END

class MyClass : public MyClassBase {
  public: 
    MyClass() : MyClassBase() {};
};

int main(int argc, char **argv) {
    MyClass myclass;
    myclass.setNrA(4);    
    return 0;
}
4

4 に答える 4

3

マクロは C++ の最大の機能ではありませんが、スコープの問題、デバッグの制限、およびその他の想定外の理由により、時折使用されます。マクロはテキスト置換であるため、例のようにテキスト入力を使用してコードを作成できるという利点があります。

「動的」クラスを作成するためのアプローチの付加価値はわかりませんが、同様のアプローチは、列挙値またはその他の繰り返しコードのシリアル化または値チェックに使用できる場合があります。マクロをログに使用して、ファイル名/行番号/関数名/... を取得することもできます。

したがって、既に Gumik がコメントしているように、テンプレートを使用してこれを行う方法がわかりません。

于 2012-04-26T09:39:24.857 に答える
1

テンプレートミックスインを使用して、さまざまなタイプのセッターとゲッターを組み合わせることができます。テンプレートミックスインは、テンプレートパラメータから継承するクラスを定義します。マクロの代わりにミックスインを使用した例を次に示します。

class MyBaseClass {
public:
    MyBaseClass() {}
};

template<class B> class SetGetNrA : public B {
private:
    int NrA;
public:
    void setNrA(int NrA) { this->NrA = NrA; }
    int getNrA() { return NrA; }
};

template<class B> class SetGetNrB : public B {
private:
    float NrB;
public:
    void setNrB(float NrB) { this->NrB = NrB; }
    float getNrB() { return NrB; }
};

今それを使用するには:

typedef SetGetNrA<SetGetNrB<MyBaseClass> > MyClass;
MyClass myclass;
myclass.setNrA(4);

変数の型をテンプレートパラメータにすることもできますが、変数の名前をパラメータにする場合は、マクロを使用する必要があります。それでも、テンプレートでより多くの作業を行うことで、マクロ置換だけの場合よりも優れたコンパイラ(clang ++)からより良いエラーメッセージを受け取ることができます。

于 2012-04-26T20:26:09.927 に答える
0

最も簡単な解決策はstd::tuple. 名前を除いて、必要なすべての機能が含まれています。setnrA(int)タプルメソッドの代わりに になりますset<1>(int)。明らかに列挙型を追加して意味のある名前をタプル インデックスに割り当てることができるので、.set<nrA>(4)

于 2012-04-26T09:56:32.513 に答える
0

「Modern C++ Design: Generic Programming and Design Patterns Applied」という本を読むことをお勧めします。具体的には、「PolicyBased クラスの設計」の章でいくつかのアイデアが得られる場合があります。ただし、それがあなたの正確なニーズに一致するかどうかはわかりません。

于 2012-04-26T17:09:48.597 に答える