减少if / if代码的数量(C ++)

时间:2011-01-22 16:33:12

标签: c++ templates if-statement

在我的程序中,我必须创建一个对象,如下所示:

Library::Param1<Library::Param2>::Param3(不知道如何命名Param,类型可能?) 与std::vector<std::string>::iterator类似。

因此,这些Param需要通过字符串进行更改。例如:

if(param1 == "1_VALUE1")
{
    if(param2 == "2_VALUE1")
    {
        MyLib::1_VALUE1<MyLib::2_VALUE1>::Param3 obj;
        //Obj is used
    }
    //15+ similar if-statements, where only 2_VALUE1 changes
}
/*15+ similar if-statements, where only 1_VALUE1 changes,
  but the contents remain same (again 15+ if-statements)*/

using namespace MyLib;不是必须的。

所以,我需要减少那些if语句的数量,但我不知道如何做到这一点。我认为它可以用模板完成,但我不熟悉它们,所以,我想,我需要一个代码示例。

抱歉英文不好,如果需要更多信息 - 请告诉我。谢谢。

---编辑:库(CryptoPP)类型定义:

由于错误仅在Param1上发布,因此发布一个变体:

//! CBC mode with ciphertext stealing
template <class CIPHER>
struct CBC_CTS_Mode : public CipherModeDocumentation
{
 typedef CipherModeFinalTemplate_CipherHolder<CPP_TYPENAME CIPHER::Encryption, CBC_CTS_Encryption> Encryption;
 typedef CipherModeFinalTemplate_CipherHolder<CPP_TYPENAME CIPHER::Decryption, CBC_CTS_Decryption> Decryption;
};

2 个答案:

答案 0 :(得分:3)

我同意Mark B的说法,工厂会很好,但是如果你没有所有这些类型继承的基类,我不确定这是否可行。如果我理解问题是正确的,那么Value 1有15种类型,Value2有15种类型,这导致15 * 15 if语句。您可以使用以下方法将它们减少到2 * 15 :(未经测试)

--- EDIT1:改变了方法的顺序---

模板     void level2()     {       typename T1_T2 :: Param3 obj;       doSomething的(OBJ);     }

template <template<class> class T1>
void level1(std::string param2)
{
 if (param2 == "2_VALUE1")
   level2<T1<MyLib::2_Value1> >();
 if (param2 == "2_VALUE1")
   level2<T1<MyLib::2_Value2> >();
 ...
}


void level0(std::string param1, std::string param2)
{
 if (param1 == "1_VALUE1")
   level1<MyLib::1_Value1>(param2);
 if (param2 == "1_VALUE2")
   level1<MyLib::1_Value2>(param2);
 ...
}

--- EDIT2 ---

为了帮助您弄清楚无法编译的原因,您可以从这个示例代码开始(在Visual Studio 2008上编译):

void doSomething(int x)
{
}

struct Type2_1 {};

template <class T2>
struct Type1_1
{
    typedef int Param3;
};

template <class T2>
struct Type1_2
{
    typedef int Param3;
};

template <template<class> class T1>
void level1(std::string param2)
{
 if (param2 == "2_VALUE1")
   level2<T1<Type2_1> >();
}

void level0(std::string param1, std::string param2)
{
 if (param1 == "1_VALUE1")
   level1<Type1_1>(param2);
 if (param2 == "1_VALUE2")
   level1<Type1_2>(param2);
}

template <class T1_T2>
void level2()
{
  typename T1_T2::Param3 obj;
  doSomething(obj);
}

int main(int argc, char* argv[])
{
  level0("1_VALUE1", "2_VALUE1");
  return 0;
}

请注意“doSomething()”应该是您希望MyLib对您的obj做的任何事情;如果没有基类,从level0 / 1/2返回obj将无效。

答案 1 :(得分:0)

不要使用类似的if语句动态更改类型,而C ++不支持这种语句,而是考虑使用像工厂模式这样的东西。

基本上,您设置了一个类层次结构,这些类具有实现您在if个案例中尝试执行的操作的虚拟方法。然后创建一个函数,从一组字符串创建适当的子类,然后在创建的实例上调用go或其他任何内容。