在 C++11 中实现元函数 zip

2024-01-04

我实际上想看看是否可以获得一个最小的库,该库支持我从 boost::fusion 使用的极少数操作。

这是我到目前为止所拥有的......

template < typename... Types >
struct typelist
{
};

template < template < typename... > class F, typename... Args >
struct apply
{
  typedef typename F < Args... >::type type;
};

template < typename, template < typename... > class >
struct foreach;

template < typename... Types, template < typename Arg > class F >
struct foreach < typelist < Types... >, F >
{
  typedef typelist < typename apply < F, Types >::type... > type; 
};

由于元功能foreach我认为实施是微不足道的zip也会很容易。显然,情况并非如此。

template < typename... >
struct zip;

template < typename...  Types0, typename... Types1 >
struct zip < typelist < Types0... >, typelist < Types1... > >
{
  typedef typelist < typelist < Types0, Types1 >... > type;
};

我该如何概括这一点zip元函数到任意数量的类型列表?这里我们需要的似乎是一个参数包的参数包。我不知道该怎么做。

Edit 1:

实施is_equal...

template < std::size_t... Nn >
struct is_equal;

template < std::size_t N0, std::size_t N1, std::size_t... Nn >
struct is_equal < N0, N1, Nn... >
: and_ <
    typename is_equal < N0, N1 >::type
  , typename is_equal < N1, Nn... >::type
  >::type
{
};

template < std::size_t M, std::size_t N >
struct is_equal < M, N > : std::false_type
{
  typedef std::false_type type;
};

template < std::size_t N >
struct is_equal < N, N > : std::true_type
{
  typedef std::true_type type;
};

可以采取类似的方法zip我也认为...没有尝试过zip还没有,但是当我回家时会这样做。

Edit 2:

这是我最终认为看起来更优雅的。这基本上是 Vaughn Cato 方法的变体。

namespace impl
{

template < typename Initial, template < typename, typename > class F, typename... Types >
struct foldl;

template < typename Initial, template < typename, typename > class F, typename First, typename... Rest >
struct foldl < Initial, F, First, Rest... >
{
  typedef typename foldl < typename F < Initial, First >::type, F, Rest... >::type type;
};

template < typename Final, template < typename, typename > class F >
struct foldl < Final, F >
{
  typedef Final type;
};

template < typename Type, typename TypeList >
struct cons;

template < typename Type, typename... Types >
struct cons < Type, typelist < Types... > >
{
  typedef typelist < Types..., Type > type;
};

template < typename, typename >
struct zip_accumulator;

template < typename... Types0, typename... Types1 >
struct zip_accumulator < typelist < Types0... >, typelist < Types1... > >
{
  typedef typelist < typename cons < Types1, Types0 >::type... > type;
};

template < typename... Types0 >
struct zip_accumulator < typelist <>, typelist < Types0... > >
{
  typedef typelist < typelist < Types0 >... > type;
};

template < typename... TypeLists >
struct zip
{
  typedef typename foldl < typelist <>, zip_accumulator, TypeLists... >::type type;
};

}

template < typename... TypeLists >
struct zip
{
  static_assert(and_ < typename is_type_list < TypeLists >... >::value, "All parameters must be type lists for zip");
  static_assert(is_equal < TypeLists::length... >::value, "Length of all parameter type lists must be same for zip");
  typedef typename impl::zip < TypeLists... >::type type;
};

template < typename... TypeLists >
struct zip < typelist < TypeLists... > > : zip < TypeLists... >
{
};

这治疗zip as a fold手术。


这是我发现的最短的实现:

template <typename...> struct typelist { };   
template <typename A,typename B> struct prepend;
template <typename A,typename B> struct joincols;
template <typename...> struct zip;    

template <typename A,typename... B>
struct prepend<A,typelist<B...> > {
  typedef typelist<A,B...> type;
};

template <>
struct joincols<typelist<>,typelist<> > {
  typedef typelist<> type;
};

template <typename A,typename... B>
struct joincols<typelist<A,B...>,typelist<> > {
  typedef typename
    prepend<
      typelist<A>,
      typename joincols<typelist<B...>,typelist<> >::type
    >::type type;
};

template <typename A,typename... B,typename C,typename... D>
struct joincols<typelist<A,B...>,typelist<C,D...> > {
  typedef typename
    prepend<
      typename prepend<A,C>::type,
      typename joincols<typelist<B...>,typelist<D...> >::type
    >::type type;
};

template <>
struct zip<> {
  typedef typelist<> type;
};

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

在 C++11 中实现元函数 zip 的相关文章

  • 如何使用 C# 打印 pdf

    我在 C 应用程序中使用 进程 打印 pdf 文件 但是我无法获取打印状态 我发现可以通过 System management 和 System printing 与打印机 队列进行交互 我做了很多尝试 但都出错了使用这两个命名空间但无法打
  • 实体框架中的重复键异常?

    我试图捕获当我将具有给定用户名的现有用户插入数据库时 引发的异常 正如标题所说 我正在使用 EF 当我尝试将用户插入数据库时 引发的唯一异常是 UpdateException 如何提取此异常以识别其是否是重复异常或其他异常 catch Up
  • 如何将 C++ 类包装在基于 C 的 dll 或基于 CLI 的 dll 中?

    我被告知将我用 C 编写的类导入到 dll 中 然后在 c 应用程序中使用该 dll 下列的本指南 https stackoverflow com questions 4555961 how to use a class in dll我创建
  • C++ - 模板专业化和部分专业化

    我一直在互联网和 stackoverflow 上寻找具体的答案 但我似乎找不到 我必须创建一个通用类 然后实现特定的功能 我的具体说明是 您需要使用模板表达式参数以及模板类专业化和部分专业化 我有一个模板类 template
  • C++:获取注册表值仅给出第一个字符[重复]

    这个问题在这里已经有答案了 我试图从注册表中获取字符串值 但我只得到第一个字母 HKEY hKey char gamePath MAX PATH if RegOpenKeyEx HKEY CURRENT USER L Software Bl
  • 当我尝试使用 AVX 功能时,Clang 生成错误

    我使用的是 Windows 10 使用 Clang 版本 5 最近安装 当我编译以下内容时 define AVX define AVX2 include
  • 将占位符文本添加到文本框

    我正在寻找一种将占位符文本添加到文本框的方法 就像在 html5 中使用文本框一样 IE 如果文本框没有文本 则会添加文本Enter some text here 当用户单击它时 占位符文本消失并允许用户输入自己的文本 如果文本框失去焦点并
  • 实体框架7审计日志

    我正在将一个旧项目移植到 ASP NET 5 和 Entity Framework 7 我使用数据库优先方法 DNX 脚手架 来创建模型 旧项目基于Entity Framework 4 审计跟踪是通过重写实现的SaveChanges的方法D
  • CMake 警告:无法为目标生成安全的链接器搜索路径

    在为 pcl 项目运行 CMake 时 我收到一条警告消息 Configuring done CMake Warning at CMakeLists txt 12 add executable Cannot generate a safe
  • 未定义异常变量时通过引用捕获

    捕获异常时 标准指导是按值抛出 按引用捕获 据我了解 这有两个原因 如果由于内存不足异常而引发异常 我们将不会调用可能终止程序的复制构造函数 如果异常是继承层次结构的一部分 我们可能会对异常进行对象切片 如果我们有一个场景 我们没有在 ca
  • C++ 析构函数:何时释放内存?

    如果我删除一个导致其析构函数被调用的对象 那么内存是在析构函数完成函数中的任何操作之前还是之后被释放 仅当最小派生类子对象被销毁后才会释放内存 所以如果你有 class Base class Derived public Base publ
  • ASP MVC 5 - 403 customError 不起作用

    我正在尝试为我的应用程序创建自定义错误页面 它在大部分情况下都有效 但不适用于403 errors 我的网络配置
  • 如何使用 C# 代码使用超链接的 onClick 事件?

    我正在尝试为页面中的超链接添加条件 而不是仅仅使用特定的链接 例如 a href help Tutorial html Tutorial a 我想为不同的用户显示不同的页面 例如 如果用户以管理员身份登录 他们将看到与普通用户不同的链接 我
  • 为什么 GCC 6.3 在没有显式 C++11 支持的情况下编译此 Braced-Init-List 代码?

    我有一个问题大括号括起来的列表的不同含义 https stackoverflow com q 37682392 2642059 我知道C 03不支持C 11initializer list 然而 即使没有 std c 11编译器标志 gcc
  • 语义问题 Qt Creator:命名空间“std”中没有名为“cout”的成员

    我开始使用 Qt Creator 编写代码 对于 C 文件 我遇到很多语义问题 99 是 命名空间 yyy 中没有名为 xxx 的成员cpp文件构建 编译和输出没有问题 如果我点击例如cout 我已链接到 iostream 我是否需要在 Q
  • 检索 Autofac 容器以解析服务

    在 C WindowForms 应用程序中 我启动一个 OWIN WebApp 它创建另一个类 Erp 的单例实例 public partial class Engine Form const string url http 8080 49
  • printf 参数不足

    我的问题是关于缺少参数的 printf 之后的行为 printf s blah blah d int integer was given as argument and not int written 我已经知道 如果格式参数不足 则行为是
  • 为什么从绑定返回的对象会忽略额外的参数?

    假设我有一个带有两个参数的函数 void f int x int y 我想绑定其中之一 我可以用std bind如下 auto partiallyBoundF std bind f 10 1 partiallyBoundF仅需要一个参数 但
  • 编译器什么时候内联函数?

    在 C 中 函数仅在显式声明时才内联inline 或在头文件中定义 或者编译器是否允许内联函数 因为他们认为合适 The inline关键字实际上只是告诉链接器 或告诉编译器告诉链接器 同一函数的多个相同定义不是错误 如果您想在标头中定义函
  • 请解释为什么Java和C对此代码给出不同的答案

    public class Test public static void main String args int i 10 i i System out println value of i is i 输出是 10 当我在中执行类似的代码

随机推荐

  • Python 子进程通信在读取输出时冻结

    我正在使用 Gphoto2 在 DSLR 上拍照 因为它基于我尝试使用的 bash 命令subprocess communicate但相机拍照后就冻结了 如果我尝试gphoto2 capture image and download在终端中
  • ReactJS:上传前预览多个图像

    我正在尝试在使用 ReactJS 将多个图像上传到服务器之前在浏览器中预览它们FileReader API 然而 我遇到的问题是每次我选择一些图像进行预览时 只显示最后一个图像 我的代码如下所示 class App extends Comp
  • jQuery 将光标设置为焦点上输入字段的开头

    我有一个输入字段
  • 为什么 hadoop 对于简单的 hello world 作业来说很慢

    我正在按照hadoop网站上的教程进行操作 https hadoop apache org docs r3 1 2 hadoop project dist hadoop common SingleCluster html https had
  • 在 Angular 2 中等待服务器对 http 请求的答复

    我的 Angular2 应用程序有一点问题 我想从服务器获取一些数据以供用户登录 但我的代码仍在继续 并且有很多错误 我想等待服务器的答复 然后对我的数据执行某些操作 这是我的代码 import Injectable from angula
  • Hive:在主表上进行增量更新的最佳方法

    所以我在 Hive 中有一个主表 它将存储我的所有数据 我希望能够每月加载增量数据更新 有大量数据 数十亿行 将会有新的数据 以及更新的条目 解决这个问题的最佳方法是什么 我知道 Hive 最近升级并支持更新 插入 删除 我一直在想的是以某
  • ASI 是什么意思? [复制]

    这个问题在这里已经有答案了 可能的重复 Javascript自动插入分号的规则是什么 https stackoverflow com questions 2846283 what are the rules for javascripts
  • 在 Xcode 4 中将文件添加到单独的目标

    自从升级到 xcode 4 以来 我找不到在哪里指定资源所属的 Target 以前 我选择了该文件并点击 command i 但现在这似乎是运行该程序 而不是调出该文件的信息框 Select the project file in the
  • 禁用 dc.js 中的交互性

    我有许多使用创建的条形图dc js 在默认行为中 用户可以单击并拖动其中任何一个来更新交叉过滤器 如何使图表 仅显示 也就是说 当其他组件更新交叉过滤器时 图表也会更新 但用户无法选择 仅显示 图表中的数据来更新交叉过滤器 None
  • 查询列定义的数据长度 - SQL Server

    我希望生成数据库的所有表 列和数据类型的列表 这个查询将为我提供除数据类型长度之外的所有信息 SELECT t name AS TableName c name AS ColumnName y name AS DataType FROM s
  • 为什么一个简单的 T-SQL UDF 函数会使代码执行速度慢 3 倍

    我正在重写一些旧的存储过程 并且在使用函数而不是内联代码时遇到了意外的性能问题 该功能非常简单如下 ALTER FUNCTION dbo GetDateDifferenceInDays first date SMALLDATETIME se
  • 是否有可能/如何获取特定 Facebook 群组成员的数量(即使数量超过 500 人)?

    我需要监控 Facebook 群组用户的数量并将其显示在网站上 我知道可以使用他们的 API 获取用户 ID 但仅限 500 个 如果会员总数超过 500 人 获取注册我建立的 Facebook 群组的成员总数的最简单方法是什么 这是可能吗
  • teamcity错误MSB4057:项目中不存在目标“pack”

    无法使用 4 7 框架为 Dot Net Core 项目创建包 我正在 teamcity 中使用 msbuild t pack p COnfiguration Release 命令来创建包
  • 从 JSON 类别中获取数据

    我正在编写一个应用程序 我在其中从 JSON 中获取数据 我能够获取类别列表但每当我点击任何类别时未获取产品列表始终在该特定类别下获取空白活动 JSON categoryId 1 categoryTitle SmartPhones Smar
  • User.IsInRole 返回 false

    我正在使用 Identity 2 在 mvc 5 网站中进行身份验证 在我看来 我想检查用户的角色 if User IsInRole Customers do something 但这总是返回 false 我已经设置了
  • 带有 Facebook 评论的自定义滚动条

    The goal 我想在窗口加载时运行滚动条脸书评论 容器 问题 滚动条工作得很好 但我必须resize屏幕强制其调用 场景 I made jsFiddle 上的示例 http jsfiddle net vDUyU 看一下 说明当前的情况
  • 用 C 生成所有元组 - 比嵌套循环更好的方法?

    我有一个数组double x 长度为 11 的函数f double x 我想找到函数的最小值f 通过离散化 所以对于给定的值val1 val2 valn我需要一个循环遍历 val 1 val n 11 中 x 的所有元组 我可以轻松地使用
  • C++ 概念占位符类型推导

    在范围规范中N4622 http www open std org jtc1 sc22 wg21 docs papers 2016 n4622 pdf the Same概念被定义为两种类型T and U 但有时在内部使用requires只有
  • 无法从 START_ARRAY 令牌中反序列化 java.util.HashMap 的实例

    我在使用 jackson core 2 7 3 jar 解析 JSON 时遇到问题 你可以从这里得到它们http repo1 maven org maven2 com fasterxml jackson core http repo1 ma
  • 在 C++11 中实现元函数 zip

    我实际上想看看是否可以获得一个最小的库 该库支持我从 boost fusion 使用的极少数操作 这是我到目前为止所拥有的 template lt typename Types gt struct typelist template lt