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 回答