如何在C ++中基于其他参数声明变量

时间:2018-03-17 23:18:26

标签: c++

我有以下代码(例如):

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(反之亦然)

1 个答案:

答案 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)};
}    

还有很多其他可能性。