我想知道是否有一种方法可以自动将指针类型分配给成员变量。我正在尝试类似的东西:
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)
答案 0 :(得分:4)
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
}
答案 1 :(得分:0)
您不能使用:
--format=csv
因为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.
的知识,我将无法提供更多有用的建议。