如何在不使用MACRO的情况下访问成员变量

时间:2013-06-24 05:17:38

标签: c++ templates macros

我删除了我的旧问题,并在此重新提出问题。我可以使用模板来实现以下功能吗?

#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);
}

2 个答案:

答案 0 :(得分:4)

简短的回答:没有。但你为什么要这样做? (类变量,成员)符号有什么特别之处?您显然可以编写一个需要st.t1代替st, t1的函数 - 为什么要避免这种情况?

答案很长:没用。在您调用t1时,FUNC(st, t1)不在范围内......当前宏将其替换为st.t1,可以在当前范围内找到它。如果你真的真的绝对想要破解某些东西,你必须放置某种t1t2t3h2范围内的对象,可以传递给函数,并以某种方式编码应该访问哪个字段。让本地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在您的示例中未初始化,因此您的代码显示未定义的行为。