我有以下代码(例如):
void Foo(int ip_selector)
{
ipv4_hdr_t ipv4;
ipv6_hdr_t ipv6;
{
…
if(ip_selector == 0)
addStack(ipv4);
else
addStack(ipv6);
}
{
…
if(ip_selector == 0)
addStack(ipv4);
else
addStack(ipv6);
}
…
}
int main()
{
for (int i = 0; i < 2; i++) {
Foo(i);
}
}
void Foo(int ip_selector)
{
ipv4_hdr_t ipv4;
ipv6_hdr_t ipv6;
{
…
if(ip_selector == 0)
addStack(ipv4);
else
addStack(ipv6);
}
{
…
if(ip_selector == 0)
addStack(ipv4);
else
addStack(ipv6);
}
…
}
int main()
{
for (int i = 0; i < 2; i++) {
Foo(i);
}
}
在上面的代码中,addStack param取决于Foo()中的选择器参数。上面的代码工作正常,但是它可以增长的规模,我不想添加如果ip_selector检查Foo()中的任何地方,以查看在addStack()中传递哪个arg。我试图找到一种方法来选择ipv4_hdr_t / ipv6_hdr_t而不写if else条件。事实上,我甚至不需要ip_selector的ipv6声明为0(反之亦然)
答案 0 :(得分:0)
这是解决此类问题的一种方法。
1.有一个协议的基类,比如Protocol
。
2.从基类中获取你的ip4 / ip6 / whateverelse类。
3.创建一系列可用协议。
4.使用选择器选择一个数组元素。
class Protocol {
virtual void addStack() = 0;
...
};
class Ip4Protocol : public Protocol {
ip4_hdr_type hdr;
void addStack(){...}
};
vector<Protocol*> availableProtocols = {
new Ip4Protocol(),
new IP6Protocol(),
...
};
...
for (int i = 0; i < availableProtocols.size(); i++) {
avalableProtocols[i]->addStack();
}
或者您也可以在派生类上使用模板
termplate <class P> class IP : public Protocol {
P hdr;
void addStack() {addGlobalStack(hdr)};
}
还有很多其他可能性。