使用模板参数设置特定成员

时间:2013-01-03 17:02:50

标签: c++ templates

让我说我有这个:

    struct myStruct {
    int A;
    int B;
}

是否可以通过这样的模板参数设置特定成员?

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

//用法:

setTo10<"member A">(obj);

我知道宏可以使用宏但模板怎么样?

感谢

2 个答案:

答案 0 :(得分: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';
}

答案 1 :(得分: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)