2

私はcharに対してswitchステートメントを実行していますが、多くの場合、との間の唯一の違いは、特定の構造体'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と7が3に切り替えられることです...少し上の反復コードを単純化する方法はありますか?たぶん、両方のケースに共通する動作のいくつかを崩壊させますか?

4

4 に答える 4

4

関数をテンプレート化し、それらの'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;
}
于 2012-07-14T22:35:28.247 に答える
1

そんな感じ:

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;
}

しかし、それはかなり複雑に見えます...

于 2012-07-14T22:12:00.957 に答える
1

繰り返し部分を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);
于 2012-07-14T22:15:25.607 に答える
0
    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;
    }
于 2012-07-14T22:12:56.247 に答える