c++ - 在运行时选择模板参数时如何避免代码呈指数增长
问题描述
考虑一堆基本类型 ,Foo
它们都具有通用方法的独特实现,Bar()
。我可以像这样组合Foo1
, Foo2
:Foo5
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);
if
使用s 和switch
s 解决 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
s 组合在一起以对Do
.
对于那些想知道现实世界动机的人:这是一个优化问题,其中我Foo
的 s是可以编辑我的解决方案Generator
的基本Move
s,然后将其发送到各种启发式中。如果我一次只发送一个Generator
,那么我的求解器将重复相同类型的移动数千次,因此总是无效率/卡在局部最小值(众所周知,重复相同类型的移动有这个影响)。
我在运行时选择其中一些模板参数的原因是因为某些Move
s 不适合某些问题实例(我的程序直到运行时才意识到)。
解决方案
不确定这是你需要的,但是这个呢:
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();
}
推荐阅读
- spring - 使用 Spring Cloud 连接器和 HikariCP 配置 Postgresql sslrootcert
- python - 我们可以在 kivy 中使用 matplotlib.animation 吗?如果是,如何?
- javascript - 当我从另一个函数内部调用它时,函数一直返回 0
- jolie - 使用 Jolie 存储工作流状态
- linux - 如何在mongodb中将数据库从一台服务器复制到另一台服务器
- json - 如何在 couchbase 数组中搜索特定字符串
- xml - XSLT 的 document() 函数的 TWIG 等价物是什么?
- c++ - 如果从使用 Poco/Timer 启动的线程进行日志记录,则 Poco HTTPServer 中止
- java - 我可以在我的 java 应用程序上为 config.yml 指定默认值吗?
- node.js - db.createRole 与 Mongoose