gpt4 book ai didi

c++ - 在运行时选择模板参数时如何避免代码的指数增长

转载 作者:行者123 更新时间:2023-12-01 14:43:14 25 4
gpt4 key购买 nike

考虑一堆基本类型Foo,它们都具有通用方法Bar()的独特实现。我可以像这样组合Foo1Foo2Foo5:

CombinedFoo<Foo1, Foo2, Foo5> combined_foo;
它使用递归继承有效地使 CombinedFoo与以下内容相同:
class CombinedFoo <Foo1, Foo2, Foo5>
{
Foo1 foo1;
Foo2 foo2;
Foo5 foo5;

public:

void Bar ()
{
foo1.Bar();
foo2.Bar();
foo5.Bar();
}
};
这很方便,但是当我想在运行时选择将哪些 Foo类型组合(合并为单个对象)发送给函数时,我遇到了一个问题,例如:
template <typename Foo> void Do (Foo && foo);
使用 ifswitch的示例解决方案来解决3个选项的版本:
int result = 0;

if (criteria_for_foo1)
result += 100;

if (criteria_for_foo2)
result += 10;

if (criteria_for_foo3)
result += 1;

switch (result)
{
case 001 : Do(Foo3());
break;

case 010 : Do(Foo2());
break;

case 011 : Do(CombinedFoo<Foo2, Foo3>());
break;

case 100 : Do(Foo1());
break;

case 101 : Do(CombinedFoo<Foo1, Foo3>());
break;

case 110 : Do(CombinedFoo<Foo1, Foo2>());
break;

case 111 : Do(CombinedFoo<Foo1, Foo2, Foo3>());
break;

default : break;
}
if语句很好,它们线性增长,但是随着我们有更多选择, switch语句呈指数增长。我的实际问题有4个选项,因此我需要处理16个我不想维护的案例。
我相信没有办法避免可执行文件呈指数增长,但是有没有办法在c++代码中避免这种情况( 而又没有在Bar方法中引入明显的低效率)?还是有解决此一般问题的已知解决方法/替代方法?
编辑:
为了清楚起见: Do(Foo1); Do(Foo2)Do(CombinedFoo<Foo1, Foo2>())不同,对于单个调用 Foo来说,将 Do组合在一起至关重要。
对于那些想了解现实世界动机的人:这是一个优化问题,我的 Foo实际上是可以编辑我的解决方案的基本 GeneratorMove,然后将其发送到各种启发式方法中。如果我一次只发送一个 Generator,那么我的求解器将重复执行数千次相同类型的 Action ,因此总是无能为力/停留在局部最小值上(反复考虑相同类型的 Action 众所周知这种效果)。
我在运行时选择一些模板参数的原因是因为某些 Move不适用于某些问题实例(我的程序直到运行时才意识到)。

最佳答案

不知道这是您所需要的,但是这又如何呢:

Foo *obj1 = nullptr;
Foo *obj2 = nullptr;
Foo *obj3 = nullptr;
Foo *obj4 = nullptr;

if (cond1) { obj1 = new Foo1; /* do more stuff here */ }
else if (cond2) { obj2 = new Foo5; /* do more stuff here */ }
else if (cond3) { obj4 = new Foo5; /* do more stuff here */ }
else { obj3 = new Foo3; /* do more stuff here */ }

然后,调用此函数:
void func(
Foo *obj1,
Foo *obj2,
Foo *obj3,
Foo *obj4)
{
if (obj1) obj1->bar();
if (obj2) obj2->bar();
if (obj3) obj3->bar();
if (obj4) obj4->bar();
}

关于c++ - 在运行时选择模板参数时如何避免代码的指数增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60796719/

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