我删除了我的旧问题,并在此重新提出问题。我可以使用模板来实现以下功能吗?
#include <iostream>
using namespace std;
#define FUNC(T1, T2) do {cout<< T1.T2<<endl; } while(0);
struct ST{
double t1;
int t2;
double t3;
};
struct ST2{
int t1;
double h2;
};
int main()
{
ST st;
ST2 st2;
st.t1 = 1.1;
st.t2 = 0;
st.t3 = 3.3;
FUNC(st, t1);
FUNC(st, t2);
FUNC(st, t3);
FUNC(st2, h2);
}
答案 0 :(得分:4)
简短的回答:没有。但你为什么要这样做? (
类变量,
成员)
符号有什么特别之处?您显然可以编写一个需要st.t1
代替st, t1
的函数 - 为什么要避免这种情况?
答案很长:没用。在您调用t1
时,FUNC(st, t1)
不在范围内......当前宏将其替换为st.t1
,可以在当前范围内找到它。如果你真的真的绝对想要破解某些东西,你必须放置某种t1
,t2
,t3
,h2
范围内的对象,可以传递给函数,并以某种方式编码应该访问哪个字段。让本地t1
等成为指向成员变量的指针是一个明显的选择。这会非常不方便,冗长且容易出错:设置所有这些额外的变量只是为了支持这种间接。
答案 1 :(得分:3)
我认为你不能用那种确切的语法做任何事情。但是你可以通过成员指针和函数模板获得一些东西:
template <typename T, typename Q>
void print(T& var, Q T::* mem)
{
cout << var.*mem << endl;
}
使用:
print(st, &ST::t1);
print(st, &ST::t2);
print(st2, &ST2::h2);
请注意,st2.h2在您的示例中未初始化,因此您的代码显示未定义的行为。