【问题标题】:How to access member variable without using MACRO如何在不使用 MACRO 的情况下访问成员变量
【发布时间】:2013-06-24 05:17:37
【问题描述】:

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

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

【问题讨论】:

    标签: c++ templates macros


    【解决方案1】:

    简短回答:不。但你为什么要这样做? (class variable, member) 表示法有什么特别之处?您显然可以编写一个采用 st.t1 而不是 st, t1 的函数 - 为什么要避免这种情况?

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

    【讨论】:

    • 对不起。我的例子可能过于简单化了。我的初衷是获取特定成员变量的地址和类型,以便我可以创建另一个类来观察和更新变量(但不是整个类)
    • 那么 Mat 所展示的技术应该可以帮助您:在内部它可以存储合适的函子,或者创建一个合适的特定于类型的模板实例化,您可以从观察/更新代码中以多态方式将其分派给您。 ..
    • 感谢您的帮助。我只是试图简化我的问题,但我并没有明确表达我的意图。
    【解决方案2】:

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

    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-08-06
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多