1

クラスがあるとします:

struct CAT
{
    //In order to simplify the problem, supposing the possible 
    // types of member variables are just int,double or string
    int a;
    double b;
    string c;
    int d;
    ....
};

私の場合、各メンバー変数がそのインデックスを使用してアクセスできるように、関数を作成する必要があります。

例えば:

CAT cat;
setValue(cat,0,10);
setValue(cat,1,2.1);
setValue(cat,2,"hello");
setValue(cat,3,123);
//or
int i=1;
setValue(cat,i,2.1)

私の頭に浮かぶ最初のアイデアは、テンプレートを使用することです:

    template<typename T>
    void setValue(CAT &c, int idx, T value)
    {
          if (0 == idx){
              c.a = value;   //compile failure when using setValue(c,2,"hello")
          } else if( 1 == idx){  
              c.b = value;  
          } else if( 2 == idx){  
              c.b = value;   //compile failure when using setValue(c,0,10)
          }
          ...
    }

ただし、コード内のコメントのために機能しません。

それについてのアイデアはありますか?

前もって感謝します。

変更:

複数のテーブルとそのレコードを異なる C 構造体に変換するプログラムを作成する必要があります。たとえば、テーブル CAT、そのスキーマは次のとおりです。

CAT(a,b,c,d,....)

に変換

struct S_CAT  //this is generate automatically by code
{
    int a;
    double b;
    string c;
    int d;
    ...
};

//automatically generate some code to write all records of table CAT to struct S_CAT

c構造体を自動生成するコードを生成するのは簡単ですが、レコードを入れるコードを生成するのは難しいです。

4

1 に答える 1

0

通常のメソッドのオーバーロードを使用するか、テンプレートのいくつかの特殊化を提供できます。

void setValue(CAT &c, int idx, int value) {
    if (0 == idx) {
        c.a = value;
    } else if (3 == idx) {
        c.d = value;
    } else {
        Assert(false, "wrong type for index");
    }
}
void setValue(CAT &c, int idx, double value) {
    if (1 == idx) {
        c.b = value;
    } else {
        Assert(false, "wrong type for index");
    }
}
void setValue(CAT &c, int idx, string value) {
    if (2 == idx) {
        c.c = value;
    } else {
        Assert(false, "wrong type for index");
    }
}
于 2013-04-05T15:47:19.190 に答える