假设我有这个:
struct myStruct {
int A;
int B;
}
是否可以通过这样的模板参数设置特定成员?
void setTo10<?? member>(myStruct& obj) {
obj.member = 10;
}
//用法:
setTo10<"member A">(obj);
我知道宏是可能的,但是模板呢?
谢谢
像这样的东西?
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';
}
此解决方案允许通过编译时索引选择成员(可以通过另一个编译时表达式计算):
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)