c++ - 指向成员变量的指针 - 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)
解决方案
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
}
推荐阅读
- xamarin - Xamarin.Forms MasterDetailPage,其中部分母版在详细信息中可见
- azure - 安装在 Azure 云中的 Kubernetes 日志系统
- crystal-reports - 如果在第一条记录上提交,否则在水晶报告中求和变量 numberVar
- typescript - IntelliJ IDEA:如何禁用/忽略特定的自动导入建议?
- php - 如何在 Laravel 5.6 中将 Cron 条目添加到 WAMP localhost
- c# - 如何从 App.xaml.cs 中的关闭窗口获取信息?
- ios - 添加真实数据后,从不调用 Tableviews“cellForRowAt”
- google-apps-script - 谷歌脚本只转发带有大附件的收件箱
- java - 性能:Google Dataflow 将 avro 文件写入 GCS
- freebsd - 什么是 Windows“netstat 1”的 FreeBSD 等价物