指向成员变量的指针 - C 中的自动类型

Pointer to member variable - auto type in C++

本文关键字:类型 指针 成员 变量      更新时间:2023-10-16

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

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 ,因为它会超出范围。

此代码的原因是我有很多检测对象必须在循环中处理,但仅基于用户选择的成员变量。如果我认为这会大大降低性能,我不想有不必要的话。

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

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

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

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

我建议您将auto移至lambda的参数:

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
}

您无法使用:

auto DETECTOR::*ptr;

由于没有初始化器,就无法推导auto零件。例如

auto i = 10; // Type is deduced as int from 10.
auto j;      // Type cannot be deduced without an initializer.
j = 10;      // A subsequent assignment cannot be used to deduce type of j.

我无法提供更多有用的建议,而无需更多了解您的使用ptr