Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在不使用宏的情况下访问成员变量_C++_Templates_Macros - Fatal编程技术网

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

C++ 如何在不使用宏的情况下访问成员变量,c++,templates,macros,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

我删除了我的旧问题,并在这里重新表述了这个问题。我可以用模板来实现以下功能吗

#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);
}
#包括
使用名称空间std;

#define FUNC(T1,T2)do{cout简短回答:不。但是你为什么要这样做呢?
类变量
成员
符号有什么特别之处?你显然可以编写一个采用
st.T1
而不是
st,T1
符号的函数-你为什么试图避免这种情况


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

我认为你不能用这种确切的语法做任何事情。但是你可以得到一些东西使用成员指针和函数模板关闭:

template <typename T, typename Q>
void print(T& var, Q T::* mem)
{
    cout << var.*mem << endl;
}

请注意,在您的示例中,st2.h2未初始化,因此您的代码显示未定义的行为。

对不起,我的示例可能过于简化。我的初衷是获取特定成员变量的地址和类型,以便创建另一个类来观察和更新该变量(但不是整个类)然后,Mat所展示的技术应该可以帮助您:在内部它可以存储合适的函子,或者创建合适的类型特定的模板实例化,您可以从观察/更新代码中以多态方式发送到该模板实例化……感谢您的帮助。我只是试图简化我的问题,但我没有明确说明我的意图。我的原意是最终目的是获取特定成员变量的地址和类型,以便创建另一个类来观察和更新变量(但不是整个类)指向成员的指针可以做到这一点。你可以将指针和引用实例的形式存储在类中。我不太明白你想做什么,很难更具体地说。谢谢你的回复。我想我很乐意接受你的答案。我想在发布时将我的问题归结为最简单的问题。但是它也很容易误导人们。
print(st, &ST::t1);
print(st, &ST::t2);
print(st2, &ST2::h2);