0

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

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

2 回答 2

4

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

长答案:没有用。 t1不在您调用的范围内FUNC(st, t1)...当前宏将其替换为st.t1可以在当前范围内找到的宏。如果您真的非常想破解某些东西,则必须将某种t1, t2,t3h2对象放在可以传递给函数的范围内,并以某种方式对应该访问的字段进行编码。让 local t1et al 成为指向成员变量的指针是一个显而易见的选择。这将非常不方便,冗长且容易出错:设置所有这些额外的变量只是为了支持这种间接性。

于 2013-06-24T05:20:13.213 回答
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,因此您的代码表现出未定义的行为。

于 2013-06-24T05:27:41.893 回答