gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:51:33 25 4
gpt4 key购买 nike

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

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
}

关于c++ - 指向成员变量的指针 - C++ 中的自动类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54775560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com