如何简化这个typedef不同的switch语句

How can I simplify this typedef different switch statement?

本文关键字:switch 语句 typedef 何简化      更新时间:2023-10-16

我正在对一个字符执行切换语句,通常'A''a'之间的唯一区别是我在特定结构中的某些静态常量和随机数字常量。这里有一个例子:

switch(someChar)
{
case 'A':
{
    typedef structWithConstants<caseA, UPCASE> constantsT;
    someStruct s;
    s.bla = bla;
    s.foo = getfoo7(rat+constantsT::rat);
    s.other = getOther10(other + constantsT::other);
    someFunctionBar(&s);
}
break;
case 'a':
{
    typedef structWithConstants<caseA, LOWCASE> constantsT;
    someStruct s;
    s.bla = bla;
    s.foo = getfoo3(rat+constantsT::rat);
    s.other = getOther10(other + constantsT::other);
    someFunctionBar(&s);
}
break;
}

所以在上面,从字面上看,在代码方面唯一的区别是使用的常数T和切换到三。。。有没有一种方法可以简化上面的重复代码?也许会破坏这两种情况之间的一些共同行为?

可以对一个函数进行模板化,为那些"foo"-s声明一个类型,然后将大小写模板参数传递给某个调用方函数

typedef int getfootype(char c);
template<getfootype f,char CASING>
void  handle(char c)
{
        typedef structWithConstants<caseA, CASING> constantsT;
        someStruct s;
        s.bla = bla;
        s.foo = f(rat+constantsT::rat);
        s.other = getOther10(other + constantsT::other);
        someFunctionBar(&s);
}
switch(someChar)
{
    case 'A':
          handle<getfoo7,UPCASE>(someChar);
       break;
    case 'a':
          handle<getfoo3,LOWCASE>(someChar);
       break;
}

类似的东西:

switch(someChar)
{
case 'A':
case 'a':
{
    typedef structWithConstants<caseA, UPCASE> constantsT_UP;
    typedef structWithConstants<caseA, LOWCASE> constantsT_LO;
    someStruct s;
    s.bla = bla;
    if (someChar == 'a')
      s.foo = getfoo3(rat+constantsT_LO::rat);
     else
    s.foo = getfoo7(rat+constantsT_UP::rat);
    s.other = getOther10(other + (someChar == 'a') ? constantsT_LO::other : constantsT_UP::other);
    someFunctionBar(&s);
}
break;
}

但它看起来相当复杂。。。

将重复零件放置在switch:之外

someStruct s;
s.bla = bla;
switch(someChar)
{
case 'A':
    typedef structWithConstants<caseA, UPCASE> constantsT;
    s.foo = getfoo7(rat+constantsT::rat);
break;
case 'a':
    typedef structWithConstants<caseA, LOWCASE> constantsT;    
    s.foo = getfoo3(rat+constantsT::rat);
break;
}
s.other = getOther10(other + constantsT::other);
someFunctionBar(&s);
    switch(someChar)
    {
    case 'A': case 'a' :
    {
        typedef structWithConstants<caseA, UPCASE> constantsT;
        someStruct s;
        s.bla = bla;
        if(someChar == 'A')
            s.foo = getfoo7(rat+constantsT::rat);
        else if(someChar == 'a')
            s.other = getOther10(other + constantsT::other);
        someFunctionBar(&s);
        s.foo = getfoo3(rat+constantsT::rat);
        break;
    }