有没有办法摆脱 boost::mpl for_each ?

2023-11-22

确实很简单的问题,让我介绍一些背景:

我有一个mpl::vector类型,其中每种类型都有一个 id,在运行时我使用mpl::for_each迭代此向量并找到给定 id 的匹配类型。但一旦找到,继续循环就没有意义了,所以 - 问题是,有没有办法摆脱它(不抛出异常)?


实施类似的事情find_if我改变了 for_each (称它为exec_if)采取bool模板参数。这bool指示是否应该执行下一个序列,或者影响提前返回。

#include <iostream>

#include <boost/mpl/vector.hpp>
#include <boost/mpl/is_sequence.hpp>
#include <boost/mpl/begin_end.hpp>
#include <boost/mpl/apply.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/next_prior.hpp>
#include <boost/mpl/deref.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/mpl/assert.hpp>

namespace mpl = boost::mpl;

template< bool done = true >
struct exec_if_impl
{
  template<typename Iterator, typename LastIterator, typename Pred, typename Exec>
  static void execute(Iterator*, LastIterator*, Pred const&, Exec const&)
  {
  }
};

template<>
struct exec_if_impl<false>
{
  template<typename Iterator, typename LastIterator, typename Pred, typename Exec>
  static void execute(Iterator*, LastIterator*, Pred const& f, Exec const& e)
  {
    typedef typename mpl::deref<Iterator>::type item;

    if (!f(static_cast<item*>(0)))
    {
      typedef typename mpl::next<Iterator>::type iter;
      exec_if_impl<boost::is_same<iter, LastIterator>::value>
        ::execute(static_cast<iter*>(0), static_cast<LastIterator*>(0), f, e);
    }    
    else
      e(static_cast<item*>(0));
  }
};

template<typename Sequence, typename Pred, typename Exec>
inline
void exec_if(Pred const& f, Exec const& e, Sequence* = 0)
{
  BOOST_MPL_ASSERT(( mpl::is_sequence<Sequence> ));

  typedef typename mpl::begin<Sequence>::type first;
  typedef typename mpl::end<Sequence>::type last;

  exec_if_impl<boost::is_same<first,last>::value>
    ::execute(static_cast<first*>(0), static_cast<last*>(0), f, e);
}

namespace msg
{
  struct m1 { enum { TYPE = 1 }; static const char* name() { return "m1"; } };
  struct m2 { enum { TYPE = 2 }; static const char* name() { return "m2"; } };
  struct m3 { enum { TYPE = 3 }; static const char* name() { return "m3"; } };
  struct m4 { enum { TYPE = 4 }; static const char* name() { return "m4"; } };
  struct m5 { enum { TYPE = 5 }; static const char* name() { return "m5"; } };
}

struct checker
{
  checker(int chk_type) : type(chk_type) {}

  template <typename Mtype>
  bool operator()(Mtype* = 0) const
  {
    return Mtype::TYPE == type;
  }

  int type;
};

struct exec
{
  template <typename Mtype>
  void operator()(Mtype* = 0) const
  {
    std::cout << Mtype::name() << " executed" << std::endl;
  }
};

int main(void)
{
  typedef mpl::vector<msg::m1, msg::m2, msg::m3, msg::m4, msg::m5> mseq;

  checker chk(3); 

  exec_if<mseq>(chk, exec());

  return 0;
}

我把这个改为exec_if,所以现在当谓词匹配时,将用该类型触发要执行的函子 - 这正是我所需要的。

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

有没有办法摆脱 boost::mpl for_each ? 的相关文章

  • C 中的隐秘结构定义

    我遇到了以下情况迷宫定义 https github com gduarte lkb blob master code stack maze h code typedef struct mazeNode int hasCheese int t
  • 什么是具有副作用的表达式?为什么不应将它们传递给宏?

    我在 C 如何编程 一书中看到这样一句话 具有副作用 即变量值被修改 的表达式不应传递给宏 因为宏参数可能会被多次求值 我的问题是什么是具有副作用的表达式以及为什么不应将它们传递给宏 经典的例子是计算两个值的最大值的宏 define MAX
  • 输出 objdump -t 的输出中的“.hidden”是什么意思?

    Example objdump Logger cpp o t 00000000 g F text 00000000 hidden sti 10 Logger cpp 0b2ae32b 这意味着符号的可见性被隐藏 https develope
  • 尽管 if 语句,Visual Studio 仍尝试包含 Linux 标头

    我正在尝试创建一个强大的头文件 无需更改即可在 Windows 和 Linux 上进行编译 为此 我的包含内容中有一个 if 语句 如下所示 if defined WINDOWS include
  • 计算序列而无法存储值?

    问题陈述 here http www spoj com problems EC SER 令 S 为无限整数序列 S0 a S1 b Si Si 2 Si 1 对于所有 i gt 2 你有两个整数 a 和 b 您必须回答有关序列中第 n 个元
  • 为什么在此单元测试中,BackgroundWorker 没有在正确的线程上调用 RunWorkerCompleted?

    backgroundWorker 的全部目的是在执行耗时的任务后更新 UI 组件正如广告所宣传的那样在我的 WPF 应用程序中 但是在我的测试中 回调不会在调用线程上调用 Test public void TestCallbackIsInv
  • esp8266互联网交换机问题

    我正在尝试制作一个门继电器开关系统 我可以通过端口转发从任何地方进行操作 我找到了一个非常有用的指南和代码 我的程序基于 https openhomeautomation net control a lamp remotely using
  • Visual Studio:同时调试多个项目?

    是否可以在 Visual Studio 中同时调试多个项目 我知道您可以从解决方案属性中选择多个启动项目 但是断点是如何处理的 如果两个项目使用同一个类 它的两个不同实例 并且我因其中的断点而停止 那么它只会阻止一个程序还是同时阻止两个程序
  • 三元运算的结果(类型)是什么?

    三元运算是否返回副本或引用 我检查了以下代码 vector
  • 如何使用 Unity 动态注册通用类?

    我有一个包含很多类 300 和 BaseClass 的程序集 我想用接口注册一个泛型类 统一后 您必须在 Name如果你想解析接口的对象数组 我想要一个对象数组主视图模型自动地 有没有办法通过反射来自动执行此操作 有什么建议么 示例 伪 p
  • 使用 C# 从文本中删除数字

    我有一个要处理的文本文件 其中有一些数字 我只想要其中的文字 而不是其他任何东西 我成功删除了标点符号 但是如何删除数字呢 我想要使 用 C 代码 另外 我想删除长度大于 10 的单词 如何使用 Reg 表达式来做到这一点 您可以使用正则表
  • 如何用C语言创建字典?

    我正在用 C 语言编写一个微控制器 作为它的一部分 我想在 7 段显示器上显示某些字母 每个字母都有一个对应的数字 使 7 段显示屏显示该字母 它没有真正的模式 因为数字只是通过将显示字母所需的 7 段显示器上的位相加而成 因此如果我可以创
  • 将 boost::iostreams::mapped_file_source 与 std::multimap 一起使用

    我有相当大量的数据需要分析 每个文件大约有 5gig 每个文件的格式如下 xxxxx yyyyy 键和值都可以重复 但键是按升序排列的 我正在尝试使用内存映射文件来实现此目的 然后找到所需的键并使用它们 这是我写的 if data file
  • 如果未先将 lambda 表达式强制转换为委托或表达式树类型,则无法将其用作动态分派操作的参数

    我正在使用 NET4 5 和 VS2013 我有这个查询dynamic来自数据库的结果 dynamic topAgents this dataContext Sql select t create user id as User sum t
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 并排显示图像的一半 - OpenGL

    我为两个图像创建了两个纹理 现在我想在opengl中按图像2的左侧部分 完整的图像1 图像2的右侧部分的顺序显示该纹理 我已经做了如下 Image1 显示在 opengl 屏幕的中央 但屏幕的左右部分不正确 应分别显示 image2 的左侧
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • 如何将curlpp 添加到我的项目中?

    我正在尝试从 vb net 过渡到 C 但我陷入了困境 我从下载了curpp这给了我一个 dll exp 和 lib 文件 我将包含这 3 个文件的目录添加到项目属性中的 附加库目录 链接器 gt 常规 接下来 我将 ws2 32 lib
  • (int *)0 是空指针吗?

    这可以被认为是一个扩展这个问题 https stackoverflow com q 16563114 912144 我只对 C 感兴趣 但添加 C 来完成扩展 C11 标准 6 3 2 3 3 规定 值为 0 的整数常量表达式 或此类表达式
  • 复杂对象上的 GroupBy(例如 List

    Using GroupBy and Count gt 1我试图在列表中查找我的类的重复实例 该类看起来像这样 public class SampleObject public string Id public IEnumerable

随机推荐

  • 使用 JPA 标准通过标准构建器为 postgres jsonb 列构建谓词

    我需要将谓词添加到 JSONB 列的现有谓词列表中 Entity Entity Table name a TypeDefs TypeDef name jsonb typeClass JsonBinaryType class public c
  • NSData writeToFile:atomically: 不会立即保存文件

    我正在从网络下载 SQLite 数据库到我的 iPad 应用程序中 如果我将其写入磁盘设置atomically YES我无法立即使用它 因为即使文件在那里 sqlite 也会抱怨表不在那里 如果我使用atomically NO或者我延迟打开
  • 为仅可用作键盘快捷键的命令添加 Visual Studio 工具栏按钮

    这个问题与此相关ReSharper YouTrack 问题 在安装了 ReSharper 7 1 1 的 Visual Studio 2010 中 如果我转到 工具 gt 选项 gt 环境 gt 键盘 则会出现一个名为 ReSharper
  • Hive JDBC getConnection 不返回

    我正在关注 hive JDBC 教程 我无法让它工作 当它尝试获取连接时 它就会挂起 它也不报告任何错误 我确定 Hive 服务器正在运行 有什么帮助吗 public class HiveJdbcClient private static
  • 团队构建错误:路径...已映射到工作区

    在 Team Foundation Server 中创建新版本时 尝试运行新版本时出现以下错误 路径 C Build ProductReleases FullBuildv5 4 2x Sources 已经映射到工作区 构建服务器 23 我无
  • this.$emit 与 this.$root.$emit,vuejs 中的最佳实践

    我有 vue2 组件 可以使用以下命令添加和删除v if 在某些情况下 我在他们之间进行交流 emit来自发件人 以及 on在接收器中 我一直在使用this root emit广播自定义事件和this root on来处理事件 我发现使用t
  • 如何在JavaFX中为组布局添加背景颜色?

    我需要向 JavaFX 中的组添加背景颜色 我尝试用 CSS 添加它 但由于某种原因它不起作用 CSS 适用于所有其他布局管理器 但不适用于 Group 我该怎么办 Solution 替换您的使用Group with a Pane一切都会表
  • asp.net MVC 如何记住回发时的错误值?

    这是可行的 但是如何 我有一个帖子的控制器操作 AcceptVerbs HttpVerbs Post public ActionResult Edit Person person bool isvalid ModelState IsVali
  • 与双显示器一起使用时的 tkinter winfo_screenwidth()

    使用 tkinter canvas 要计算我显示的图形的大小 我通常使用该函数winfo screenwidth 并相应地调整我的对象的大小 但当在具有两个显示器的系统上使用时 winfo screenwidth 返回两个显示器的组合宽度
  • 绑定函数(委托)参数

    我试图在不使用 lambda 函数的情况下实现以下目标 Func
  • Cython:对于类型化内存视图,我应该使用 np.float_t 而不是 double

    关于 cython 中的内存视图 使用 NumPy 类型输入视图是否有任何优势 例如np float t而不是简单地做double如果我正在使用 numpy float 数组 我应该输入cdef然后以同样的方式 做e G ctypedef
  • 当滚动视图太短而无法滚动时,滚动视图不会滑动

    我对 Android 应用程序开发还很陌生 我一直在使用 Android 的 SimpleOnGestureListener 和 ViewFlipper 来尝试滑动手势 ViewFlipper 有 3 个子级 每个都是一个 ScrollVi
  • 使用包含空值的数组执行 PDO [重复]

    这个问题在这里已经有答案了 我需要更新数据库并且我使用 PDOexecute 方法通过给它一个数组作为参数 这个想法是 当我尝试插入一个时 它会给我一个错误NULL价值 以下是发送的查询 参数的示例 生成的查询 UPDATE table S
  • 功能:bcmod 不可用

    我在安装 joomla 组件之一时收到以下错误 功能 bcmod 不可用 请询问您的主机如何在 PHP 安装中启用此功能 您需要使用 bcmath 支持 enable bcmath 配置选项 来编译 PHP 如果您使用共享主机 他们不太可能
  • 需要良好的 WPF MVVM 教程 [重复]

    这个问题在这里已经有答案了 可能的重复 MVVM 从头到尾的教程 我刚刚开始学习WPF 我需要学习 MVVM 模式并希望在我的 WPF crud 应用程序中实现 MVVM 所以有人请指导我如何在 WPF 中遵循 MVVM 模式开发 CRUD
  • 纸浆求解器错误

    我正在尝试在 puLP Python 中求解 MILP 但不断收到以下错误 Traceback most recent call last File main lp py line 63 in
  • 前台的 Firebase 通知

    我在使用 FireBase 推送通知时遇到问题 当我的应用程序位于后台时 通知即将到来 但是当我的应用程序位于前台时 我没有收到通知 但在控制台中显示了通知 这意味着通知在这里 但没有显示在通知栏中 你可以帮帮我吗 Override pub
  • java 获取日期标记字段(上午/下午)

    我需要获取日期对象中的 AM PM 字段 我怎么才能得到它 这是我的代码 String startTime 01 05 PM SimpleDateFormat sdf new SimpleDateFormat hh mm aa Date s
  • Swift (iOS) 和 PHP 中 AES256 加密的不同结果

    我正在使用 AES256 工作 以便能够使用不安全的通道在 iOS 和 PHP 之间进行加密 解密 我见过很多类似的问题 涉及密钥大小 模式 CBC 或 ECB 随机 iv 的使用等 但在这种情况下 我发现了一个奇怪的行为 如下所示 两种环
  • 有没有办法摆脱 boost::mpl for_each ?

    确实很简单的问题 让我介绍一些背景 我有一个mpl vector类型 其中每种类型都有一个 id 在运行时我使用mpl for each迭代此向量并找到给定 id 的匹配类型 但一旦找到 继续循环就没有意义了 所以 问题是 有没有办法摆脱它