繁体   English   中英

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

[英]Pointer to member variable - auto type in 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; 失败。 我正在寻找一种没有if语句,同时遍历所有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的使用知识,我将无法提供更多有用的建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM