C++14 元编程:在编译/初始化时自动构建类型列表

2024-02-16

使用 C++14 和 Curiously Recurring Template Pattern (CRTP) 的某种组合以及可能的Boost.Hana http://www.boost.org/doc/libs/1_63_0/libs/hana/doc/html/index.html (or boost::mpl如果您愿意),我可以在编译时(或静态初始化时)构建类型列表而无需显式声明吗?

As an example, I have something like this (see it on Coliru http://coliru.stacked-crooked.com/a/12eae6bc335866fb):

#include <iostream>
#include <boost/hana/tuple.hpp>
#include <boost/hana/for_each.hpp>

namespace
{
    struct D1 { static constexpr auto val = 10; };
    struct D2 { static constexpr auto val = 20; };
    struct D3 { static constexpr auto val = 30; };
}

int main()
{
    // How to avoid explicitly defining this?
    const auto list = boost::hana::tuple< D1, D2, D3 >{}; 

    // Do something with list
    boost::hana::for_each( list, []( auto t ) { std::cout << t.val << '\n'; } );
}

我想避免明确的类型列表——D1, D2, and D3——在创作中list因为这意味着当我似乎应该能够在类声明中或周围告诉编译器“将此类添加到您的运行列表中”时,我必须手动维护该列表。 (我的最终目标是实现工厂注册自动化,而这正是缺少的机制。)

我可以使用一些继承和/或元编程技巧在编译时或静态初始化时组成列表来做到这一点吗?


要在编译时完成此操作,需要“有状态”元编程。在本文中here http://b.atch.se/posts/constexpr-meta-container/Filip Roséen 解释了如何使用极其先进的 C++14 实现以下内容:

LX::push<void, void, void, void> ();
LX::set<0, class Hello> ();
LX::set<2, class World> ();
LX::pop ();

LX::value<> x; // type_list<class Hello, void, class World>

此外,Matt Calabrese 使用类似的技术在 C++11 中实现基于语义的概念,请参阅 and slides https://github.com/boostcon/2011_presentations/blob/master/thu/Boost.Generic.pdf幻灯片#28​​。

当然,这些技术依赖于支持一致的两阶段名称查找的编译器。

或者,您可以重新构建代码以支持运行时注册,这要简单得多,并且可以跨编译器(例如 MSVC)移植。这就是诸如Prove https://github.com/pfultz2/Prove or args https://github.com/pfultz2/args使用。它使用一个通用的auto_register class:

template<class T, class F>
int auto_register_factory()
{
    F::template apply<T>();
    return 0;
}

template<class T, class F>
struct auto_register
{
    static int static_register_;
    // This typedef ensures that the static member will be instantiated if
    // the class itself is instantiated
    typedef std::integral_constant<decltype(&static_register_), &static_register_> static_register_type_;
};

template<class T, class F>
int auto_register<T, F>::static_register_ = auto_register_factory<T, F>();

然后你可以编写自己的CRTP类:

struct foo_register
{
    template<class T>
    static void apply()
    {
        // Do code when it encounters `T`
    }
};

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

C++14 元编程:在编译/初始化时自动构建类型列表 的相关文章

  • 如何拦截 .Net 中第三方库对非虚拟方法的调用?

    我认为我需要的是 net 人们称之为 透明动态代理 的东西 但到目前为止我所看到的所有实现 Castle DynamicProxy Spring NET AOP 等 都要求我至少执行以下操作之一 将拦截的方法声明为虚拟方法 包装类并创建包装
  • 使用 getopt_long (C++) 如何为两个需要参数编写长选项和短选项?

    include
  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的
  • 每个 CPU 核心处于 C0 电源状态的时间

    任何帮助弄清楚如何做到这一点都会很棒 在过去一秒内 每个 CPU 核心处于 C0 电源状态的时间有多少 这是针对 Mac 应用程序的 因此需要 Objective C cocoa 和 c OS X 没有任何公开 CPU c 状态的 API
  • 是否可以用 C# 为 Android 编写应用程序?

    我们都知道Android运行Dalvik VM程序 通常开发人员用 Java 编写程序并将其编译为 Dalvik 字节码 我想知道是否有可能创建一个可以接受 C 代码并将其编译为 Dalvik 字节码的编译器 嗯 这是一种选择 或者您可以在
  • 我应该使用函数还是无状态函子?

    这两段代码做同样的事情 如您所见 它将用于排序函数 哪个更好 我通常写后一种 但我看到一些程序员像以前那样做 struct val lessthan binary function
  • popen2()在c中如何工作?

    我尝试使用管道 叉子和 dup 在我的程序中执行 md5sume 命令 我发现总和代码运行成功 但我无法理解某些代码行 这是我的代码 int infp outfp char buf 128 if popen2 md5sum infp out
  • 未定义条件编译符号

    我无法让 Visual Studio 按照我的预期运行 我创建了 2 个配置文件 一个定义了符号 FOO 另一个定义了符号 BAR 我有这个代码 static class MyClass if FOO public static strin
  • NHibernate 中具有不同类型答案的问题

    我正在尝试找到一个问卷问题的简洁解决方案 假设我有一个Questionnaire类有一个集合Answers e g public class Questionnaire public virtual ISet
  • 为什么std::string在发布时是标准布局类型,但在调试时不是标准布局类型?

    include
  • 专家 C#/.Net/WPF 开发人员应该了解哪些知识? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • 修改公共属性的访问修饰符是否是重大更改?

    如果我将公共属性的 setter 的访问修饰符从私有更改为公共 是否会导致引用它的其他程序集发生任何重大更改 UPDATE 这个问题是我 2012 年 1 月博客的主题 https ericlippert com 2012 01 09 ev
  • 在 C# 中将 ulong 映射到 long ?

    我正在尝试将 ulong 映射到 long 反之亦然 将 uint 映射到 int 反之亦然 如下所示 为了将值保存在具有签名类型的 MS SQL 数据库中仅限整数和大整数 我这样做是因为我必须检查 在数据库中 一个数字 uint ulon
  • lambda 表达式是多线程的吗?

    lambda 表达式是多线程的吗 假设当你将数学公式编写为 lambda 方法时 当你将其传递给另一个方法时 它会是多线程的吗 不是100 清楚你问的是什么 您是否想问 lambda 是否自然地在不同的线程上运行 如果是这样 则它们只是 S
  • jquery ajax“发布”调用

    我是 jQuery 和 Ajax 的新手 并且在 发布 方面遇到问题 我正在使用 jQuery Ajax post 调用将数据保存到数据库 当我尝试保存数据时 它将 null 传递给我的 C 方法 jQuery 看起来像这样 functio
  • 组合框由于某种原因被链接

    我有以下代码来填充 3 个组合框 private void PopulateDDLs SqlConnection connection SqlCommand command SqlDataReader reader DataTable dt
  • 如何并排显示 4 个三角形图案

    我无法让 4 个不同的三角形图案并排出现 这是一个控制台应用程序 这正是我试图通过使用嵌套 for 循环来实现的目标
  • 如果未返回,则在一段时间后终止线程

    我有一个线程从网络或串行端口获取一些数据 如果 5 秒内没有收到数据 则线程必须终止 或返回 false 换句话说 如果线程运行时间超过 5 秒 则必须停止 我用 C 编写 但任何 NET 语言都可以 有两种方法 1 封装超时 从网络或串行
  • C++20 范围太多 |运营商?

    我在这段代码中使用 g 10 2 有谁知道为什么我最后收到编译器错误std views reverse on results3 include

随机推荐

  • 了解 OCR 的 Freeman 链码

    请注意 我确实在寻找问题的答案 我是not寻找一些源代码或一些学术论文的链接 我已经使用了源代码 并且我已经阅读了论文 但仍然没有弄清楚这个问题的最后部分 我正在研究一些快速屏幕字体 OCRing 并且取得了很好的进展 我已经找到基线 分离
  • 如何在浏览器刷新时清除会话存储,但这不应在单击浏览器后退按钮时清除

    我只想在页面刷新时清除会话存储 而不是在 单击浏览器后退按钮 或单击前进 想要使用 angularjs javascript 来实现这个 我在单击后退按钮时将数据保存在会话存储中 因此我想在单击浏览器刷新按钮时清除相同的数据 但不应清除后退
  • 如何在 ASP.NET MVC 应用程序的 Razor 引擎中使用 Html.Displar 渲染 ModelMetadata 对象?

    我正在尝试利用DisplayTemplatesrazor engine 中的功能可自动渲染我的显示视图 我扫描我的Model找到正确的ModelMetadata对于我想要显示的每个属性 但我无法使用以下方式渲染属性Html DisplayF
  • 如何在 docker 中启用/禁用 buildkit?

    我从文档中得到了这个命令 但我真的不知道如何使用它或者我应该从哪里开始移动 我是 docker 的新手 而且概念对我来说仍然很难消化 DOCKER BUILDKIT 1 docker build 如何使用此命令在 docker 引擎中启用
  • 如何循环遍历特定标签内的每个标签?

    我正在创建一个函数 它有一个 for 循环 该循环遍历特定 div 中的每个标签 例如 这里是 div div div
  • Android BLE 被动扫描

    我想在我的 Android 应用程序中被动扫描 BLE 广告商 但我找不到如何做到这一点 根据蓝牙4 0核心规范 存在被动扫描模式 第6卷 核心系统包 低能耗控制器卷 D 部分 4 1 被动扫描 https www bluetooth or
  • 标准化 ggplot 中叠加密度图的 x 尺度

    当叠加具有相同长度但不同比例的数据的 ggplot 密度图时 是否可以标准化图的 x 比例以使密度匹配 或者有没有办法标准化密度 y 尺度 library ggplot2 data lt data frame x c A B C D E y
  • 使用 rvm 安装 ruby​​ 标头

    Travis CI 使用 RVM 提供 Ruby 但它似乎不包含标头 find home vagrant rvm rubies ruby 1 9 3 p194 lib ruby 1 9 1 i686 linux home vagrant r
  • 如何在 Google 电子表格中使用 OR 语句嵌套 IF 块

    我正在寻找有关我在 Google 电子表格中使用的这段小代码的帮助 ArrayFormula IF OR F2 F Cancelled G2 G Cancelled Cancelled IF F2 F Finished 20 IF G2 G
  • Joi 正则表达式不被识别为正则表达式模式

    我正在尝试为密码字段制定验证规则 它应包含以下内容 必须有号码 必须至少包含一个大写字母 必须包含至少一个小写字母 必须包含以下任何符号 长度应仅为 8 到 20 个字符 这是我使用的正则表达式模式 a z A Z d A Za z d 8
  • Django:尝试在 URL 中使用 Slug 时出现 404 错误

    我是 Django 的初学者 现在 我正在通过构建一个名为 PhoneReview 的应用程序来学习该框架 它将存储与最新手机相关的评论 它还将显示手机品牌 相关手机型号及其评论 现在 我正在尝试在 URL 中使用 slug 我已经在我的两
  • SQL Server中如何保持插入顺序

    我只是想知道我是否可以保持SQL Server中数据插入的顺序 我正在开发自己的项目 它是一种包含许多帖子的博客网站 我会将我的帖子保存到 SQL Server 但我希望它们按插入顺序排列 问 据我了解 如果我在SQL Server中使用自
  • 显示和隐藏窗口,而不是在可可应用程序中关闭单击时终止应用程序

    我一直在尝试在关闭 红色按钮 单击窗口时显示隐藏窗口 我想做的是隐藏窗口 当用户再次单击我的应用程序时 它将再次显示 预先感谢所有提供答案的开发人员 我是 Cocoa 应用程序的新手 我是iOS开发人员 所以我对cocoa应用程序了解不多
  • 商店中的成功和失败函数 - Ext JS

    我有一个请求 成功后会循环遍历 JSON 响应的每个属性并将其添加到我的store var request Ext Ajax request url MCApp jsonData searchquery params start 0 lim
  • Oracle 19c 安装错误:[INS-35179] 当前可用内存小于创建 DB 所需的可用内存 (1,597MB)

    我正在尝试安装 oracle 19c 在安装过程中遇到了与内存相关的问题 INS 35179 当前可用内存小于创建 DB 所需的可用内存 6 537MB 我仔细检查了所有先决条件 例如2GB free RAM 10 GB free spac
  • 水平调整 ImageView

    我正在开发一种电子书应用程序 并尝试通过以下两种方式显示图像 当屏幕处于portrait 我将图像水平放置并垂直居中 当屏幕处于landscape 我希望图像水平填充屏幕并保持纵横比 由于我使用的图像长于宽 所以我有一个ScrollView
  • React 和 Jest:无法从测试文件中找到模块

    为目录中的 Redux 操作 App js 设置 Jest 测试 App test js app tests 这是 App js 的标头 jest unmock modules actions App js import React fro
  • 如何将具有静态值的字段添加到mongodb查找查询?

    我们可以向 mongodb 添加一些具有静态值的自定义字段吗find query 我正在尝试将 API 请求 UId 添加 附加到我们对 mongodb 进行的所有查询 以便我们可以将请求与来自 mongodb 日志的慢速查询进行映射 我在
  • H2数据库TIMESTAMP列的默认值

    我正在用 H2 数据库编写集成测试 我的数据库 生成的 初始化包括此脚本 因为生成的联接表没有此列 ALTER TABLE INT USR ADD IU INSDTTM TIMESTAMP DEFAULT NOW 这就是我创建记录的方式 I
  • C++14 元编程:在编译/初始化时自动构建类型列表

    使用 C 14 和 Curiously Recurring Template Pattern CRTP 的某种组合以及可能的Boost Hana http www boost org doc libs 1 63 0 libs hana do