首页 > 解决方案 > 指向成员变量的指针 - C++ 中的自动类型

问题描述

我想知道是否有一种方法可以自动将指针类型分配给成员变量。我正在尝试类似的东西:

struct DETECTOR
{
    Long64_t time;
    Double_t energy;
    Int_t number;
};

void member(string member_string)
{
    auto DETECTOR::*ptr;

    if(member_string == "time") ptr = &DETECTOR::time;
    if(member_string == "energy") ptr = &DETECTOR::energy;
    if(member_string == "number") ptr = &DETECTOR::number;

    //loop over a lot of DETECTOR objects and do some magic with them
}

但出于明显的原因,它不起作用。我也不能在 IF 语句中定义ptr,因为它会超出范围。

这段代码的原因是我有很多 DETECTOR 对象必须在循环中处理,但仅基于用户选择的成员变量。我不想在该循环中有不必要的 if 语句,因为我认为它会显着降低性能。

如果还有其他方法可以做到这一点,如果您能指出我将不胜感激。谢谢,我是编码的永恒初学者:)。

编辑:很抱歉没有更清楚,我知道为什么会auto DETECTOR::*ptr;失败。我正在寻找一种在循环所有DETECTOR对象时没有这样的 if 语句的解决方法。

DETECTOR det;
if(member_string =="energy") do_magic(det.energy)
if(member_string =="time") do_magic(det.time)

标签: c++

解决方案


auto不是您正在寻找的解决方案。C++ 中的类型不能在运行时更改。auto必须始终从它的初始化程序中推断出来。在您的情况下,没有初始化程序,因此它不起作用。

我建议您将 移到autolambda 的参数中:

void member(string member_string)
{
    // Here, the type of `ptr` will be
    // inferred when the lambda is called
    //             ~~~~v~~~~
    auto do_magic = [](auto ptr) {
        // loop over objects and do some magic with them
    };

    if(member_string == "time") do_magic(&DETECTOR::time);
    if(member_string == "energy") do_magic(&DETECTOR::energy);
    if(member_string == "number") do_magic(&DETECTOR::number);
}

lambda 等效于函数模板:

template<typename T>
void do_magic(T ptr) {
    // loop over objects and do some magic with them
}

推荐阅读