在运行时选择模板参数时如何避免代码呈指数级增长

2024-05-05

考虑一堆基本类型,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);

一个示例解决方案ifs and switchs 解决 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; 
}

The if报表很好,它们线性增长,但是switch随着我们有更多的选择,声明呈指数级增长。我的现实世界问题有 4 个选项,因此我需要处理 16 个我不想维护的情况。

我相信没有办法避免可执行文件呈指数增长,但是有没有办法在 C++ 代码中避免这种情况(不会造成显着的低效率Bar method)?或者对于这个一般问题是否有已知的解决方法/替代方案?

EDIT:

为了清楚起见:Do(Foo1); Do(Foo2)不等于Do(CombinedFoo<Foo1, Foo2>()),并且至关重要的是Foos 组合在一起进行一次调用Do.

对于那些想知道现实世界动机的人:这是一个优化问题,我的Foo真的是Generator基本的sMove可以编辑我的解决方案,然后将其发送到各种启发式方法中。如果我只送一份Generator有时,我的求解器会重复相同类型的移动数千次,因此总是效率低下/陷入局部最小值(众所周知,重复考虑相同类型的移动会产生这种效果)。

我在运行时选择其中一些模板参数的原因是因为一些Moves 不适用于某些问题实例(我的程序直到运行时才意识到)。


不确定这是否是您所需要的,但是这个怎么样:

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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在运行时选择模板参数时如何避免代码呈指数级增长 的相关文章

随机推荐

  • 如何将LUT png用于CIColorCube滤镜?

    我想使用查找表 png example http nghiatran me wp content uploads 2014 06 FilterMe Part2 ProcessedLUT png 作为颜色立方体数据CIColorCubeSwi
  • 获取 SecureString 作为纯文本参数

    我正在尝试将 SecureString 作为纯文本参数获取到命令行 PowerShell 我知道安全字符串的形式是什么 例如 字符串 abc 将是安全字符串 71289371289 然后 我想将 71289371289 作为参数传递给脚本
  • 如何垂直对齐div内的图像

    如何在包含的内容中对齐图像div Example 在我的示例中 我需要将 img in the div with class frame div class frame style height 25px img src http jsfi
  • 整数构造变体

    大家好 我遇到了一个有趣的事件 正在寻找解释 在 Java 1 6 中 Integer a new Integer 5 Integer b new Integer 5 System out println a b Integer c 5 I
  • 第301章

    Problem 访客打开网址website com i 133r534 213213 12312312但此网址不再有效 需要将其转发到website com 视频 133r534 213213 12312312 我尝试过的 在过去的几个小时
  • 如何提高 MongoDB 中 update() 和 save() 的性能?

    我正在寻找有关如何在以下情况下提高数据库性能的提示 作为示例应用程序 我今天编写了一个相当简单的应用程序 它使用 Twitter 流 API 来搜索某些关键字 然后将结果存储在 MongoDB 中 该应用程序是用 Node js 编写的 我
  • 带尖括号 (<>) 的方法

    方法名称中是否可以有尖括号 例如 class Foo ind1 Int ind2 Int var v new Foo 1 2 v 1 3 updates ind1 v lt 1 gt 4 updates ind2 真实情况显然比这更复杂 我
  • 如何随机获得Material Design Color?

    谷歌有他们的颜色 指南 http www google com design spec style color html 那么如何随机接收一个颜色呢 有没有办法指定表中的数字并从表的所有颜色中接收随机颜色 例如getMatColor 100
  • 使用 org.apache.cordova.file 获取选定的文件大小

    使用 org apache cordova file 插件 我可以选择该文件并获取该文件的本机路径 之后 我必须限制用户根据文件大小选择文件 但我无法理解文件大小 我的问题是我无法使用该插件获取文件大小 为此我正在使用本教程 http th
  • jQuery - 单击 LI,显示/隐藏 UL - 单击 LI:a href,继续显示 UL 并在空白窗口中打开

    感谢 SO 的出色贡献者 当您开始了解 jQuery 时 它会变得更酷 所以我有一个 LI 单击时会显示 隐藏子 UL 我想做的是能够单击 LI 内的链接 打开一个空白窗口 但也不会关闭子 UL 空白窗口打开完成 a href http a
  • Mocha 测试无法在 Nodejs 服务器上运行 [重复]

    这个问题在这里已经有答案了 客观的 找出当断言失败时我的测试崩溃的原因 背景 我有一个非常简单的 NodeJs 应用程序 我正在使用Mocha https www npmjs com package mocha for BDD https
  • Webpack 5 和 ESM

    我想我已经阅读了 SO 上的每个线程以及互联网上的每个相关页面 所有内容都有一些问题的变体 I want 使用 webpack 捆绑我的 Web 应用程序 在我的源 js 中使用 ES 模块并将它们转译为更广泛的浏览器支持 在我的 webp
  • super 在 python 中真正做什么[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我刚刚读过方法解析顺序 http python history blogspot com 2010 06 method resolution
  • PHP 中检查数字是否为浮点型

    这实在是太奇怪了 我有这段代码 rewardAmt amt if is float rewardAmt print r is float die else print r is not float die amt 的值为 0 01 但它正在
  • Struts2——异常启动过滤器struts

    我有一个和我刚才问的类似的问题 我正在尝试启动我的 Struts2 应用程序 但这次我刚刚下载了 javassist 3 0 jar 并将其添加到我的类路径 和 WEB INF lib 中 但仍然遇到同样的错误 有什么建议吗 以下是我的 w
  • 选项标签返回字符串值而不是 Angular 中 ngModel 的数字

    HTML
  • VBA:使用求解器时出现运行时错误 1004

    我是 VBA 新手 在宏中使用求解器时遇到一些问题 我将一个宏分配给 Excel 中的命令按钮 它们完美地计算了所有内容 但最后也出现了一个丑陋的错误 运行时错误 1004 对象 application 的方法计算失败 Sub serieu
  • 如何缩小从 Dart 编辑器编译的 JavaScript 代码?

    我正在使用 Dart Editor 构建 Dart 应用程序 我正在编译为 JavaScript 以在所有浏览器上运行 我想缩小输出 JavaScript 如何在不进入命令行的情况下执行此操作 我知道在命令行上 我可以使用dart2js m
  • 列表中的连续元素

    我正在阻止一个谓词来编码Prolog 我需要对两个谓词进行编码 如果我打电话 u a b c d e f X 它会给X a b X b c X c d 如果我打电话 v a b c d e f X 它会给X a b X c d X e f
  • 在运行时选择模板参数时如何避免代码呈指数级增长

    考虑一堆基本类型 Foo 所有这些都具有通用方法的独特实现 Bar 我可以结合Foo1 Foo2 Foo5像这样 CombinedFoo