在我的程序中,我必须创建一个对象,如下所示:
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;
};
答案 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
或其他任何内容。