3

私がこれを持っているとしましょう:

    struct myStruct {
    int A;
    int B;
}

このようなテンプレートパラメータを介して特定のメンバーを設定することは可能ですか?

void setTo10<?? member>(myStruct& obj) {
obj.member = 10;
}

//利用方法:

setTo10<"member A">(obj);

マクロで可能だと知っていますが、テンプレートはどうですか?

ありがとう

4

2 に答える 2

5

このようなもの?

struct myStruct {
  int A;
  int B;
};

template <typename T, typename V>
void set(T& t, V T::*f, V v)
{ t.*f = v; }

int main()
{
  myStruct m;
  set(m, &myStruct::A, 10);
  std::cout << m.A << '\n';
}
于 2013-01-03T17:08:28.630 に答える
0

このソリューションでは、コンパイル時インデックス(別のコンパイル時式を介して計算できます)を介してメンバーを選択できます。

struct myStruct {
    int A;
    int B;
};

template <int n1, int n2>
struct SetOnEqual
{
    static void set(int& var, int val)
    {} // default: do nothing
};

template<int n>
struct SetOnEqual<n, n>
{
    static void set(int& var, int val)
    {
        var = val;
    }
};

template <int n>
void setTo10(myStruct& s)
{
    SetOnEqual<n,0>::set(s.A, 10);
    SetOnEqual<n,1>::set(s.B, 10);
}

次に、次のコード

#include <stdio.h>
int main()
{
    myStruct s;
    s.A = s.B = 0;

    setTo10<0>(s); // sets s.A
    printf("s=(%d,%d)\n", s.A, s.B);

    setTo10<1>(s); // sets s.B
    printf("s=(%d,%d)\n", s.A, s.B);

    return 0;
}

出力を与えます

s=(10,0)
s=(10,10)
于 2013-01-03T17:27:14.047 に答える