gpt4 book ai didi

c++ - 减少 if/if 代码量 (C++)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:05:43 27 4
gpt4 key购买 nike

在我的程序中,我必须创建一个对象,它看起来像这样:

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

最佳答案

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

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

模板 无效级别 2() { 类型名 T1_T2::Param3 对象; 做某事(对象);

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

--- 编辑2 ---

为了帮助您找出无法编译的原因,您可以从以下示例代码开始(在 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 对您的对象执行的任何操作;如果没有基类,则无法从 level0/1/2 返回 obj。

关于c++ - 减少 if/if 代码量 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4769052/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com