【发布时间】:2021-12-24 15:45:20
【问题描述】:
正如下面的代码,我不想要这么多“if else”
class A
{
public:
void f0()
{
cout << "f0" << endl;
}
void f1()
{
cout << "f1" << endl;
}
void f2()
{
cout << "f2" << endl;
}
//..... more functions fn()...
};
class B
{
public:
void f(int n)
{
//vector< function<void()> > f_v {obj_a.f0, obj_a.f1, obj_a.f2}; //this usage is not correct
if (n == 0)
obj_a.f0();
else if (n == 1)
obj_a.f1();
else if (n == 2)
obj_a.f2();
//.....more else if here
}
private:
A obj_a;
};
我想创建一个vector并使用std::function来避免使用这么多if-else,比如vector< function<void()> > f_v {obj_a.f0, obj_a.f1, obj_a.f2};但是不行,可能std::function的用法不是很正确。我应该怎么做? 或者有什么其他好的方法可以解决if else的问题,我觉得用这么多switch-case也不是很优雅:)
更新:
一些答案已经解决了我之前代码中std::function的使用问题;
更一般地,考虑下面的代码,如果成员函数 A::f1(), A::f2().... 有不同的返回类型,但仍然有一些联系,它们派生自同一个基类,在B::f()中实现if else的逻辑有什么好办法?
class Base
{
public:
virtual ~Base()=default;
};
class D1 : public Base
{
public:
};
class D2 : public Base
{
public:
};
class D3 : public Base
{
public:
};
// ....maybe more class derived form Base
class A
{
public:
D1* f0()
{
cout << "f0" << endl;
return &d1;
}
D2* f1()
{
cout << "f1" << endl;
return &d2;
}
D3* f2()
{
cout << "f2" << endl;
return &d3;
}
//more fn()....
private:
D1 d1;
D2 d2;
D3 d3;
//.....
};
class B
{
public:
void f(int n)
{
if (n == 0)
obj_a.f0();
else if (n == 1)
obj_a.f1();
else if (n == 2)
obj_a.f2();
//.....more else if here
}
private:
A obj_a;
};
【问题讨论】:
-
这听起来完全正确。您能告诉我们您尝试使用
std::function做什么,我们可以从那里指导您吗? -
你也可以在这里使用
switch-case -
我真的觉得你应该稍微扩展一下你想要达到的目标,因为有很多方法可以解决它。如果您一心想要使用
std::function,那么您已经有了答案,但是如果您尝试使用std::function,因为您认为这是唯一的解决方案,那么如果我们知道,实际上可能会有更好的解决方案确切的问题。 -
我已经重新编辑了我的描述,感谢您的建议
标签: c++ if-statement std-function