解压类型列表

2023-11-25

假设我有一个只接受类型模板参数的函数,我无法更改它的定义/实现。

template < typename T >
void do_it();

现在我有一个以通常的方式定义的类型列表,也无法更改它:

template< typename ...Ts >
struct typelist;

我想实施一个function它接受一个类型列表,并对每种类型运行 do_it() :

template< typename List >
void do_them();

到目前为止我找到的唯一解决方案是:

template< typename T >
void do_them_impl()
{
   do_it<T>();
}

template< typename T, typename Ts...>
void do_them_impl()
{
   do_it<T>();
   do_them_impl<Ts...>();
}

template< template < typename...> class List, typename ...Ts >
void do_them_extract( List<Ts...>&& )
{
    do_them_impl< Ts >(); 
}

template< typename List >
void do_them()
{
    do_them_impl( List{} ); 
}

但这需要 4(!) 个函数,对于我想创建一个的每种情况do_them功能。我需要其中相当多的函数,并且我不想为每个函数编写四个函数。我错过了什么吗?

欢迎 C++14,也欢迎 C++17 解决方案,但如此标记。


在 C++14 中,您可以使用一些可怕的技巧来引入有效的包扩展上下文:

template< template < typename...> class List, typename ...Ts >
void do_them_impl( List<Ts...>&& )
{
    (void)std::initializer_list<int> {
        (do_it<Ts>(), 0)...  
    };
}

template< typename List >
void do_them()
{
    do_them_impl( List{} ); 
}

这使您可以避免递归模板实例化,这通常更昂贵。

现场演示


在 C++17 中你可以使用折叠表达式:

template< template < typename...> class List, typename ...Ts >
void do_them_impl( List<Ts...>&& )
{       
    (do_it<Ts>(), ...);
}

template< typename List >
void do_them()
{
    do_them_impl( List{} ); 
}

现场演示

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

解压类型列表 的相关文章

随机推荐

  • 使用 FindMatchingFiles 工作流活动的 MatchPattern 属性

    我正在使用 TFS 2010 Team Build 自定义构建过程模板的默认工作流程 有一个活动叫FindMatchingFiles允许使用中定义的模式搜索特定文件MatchPattern财产 如果我只指定一个文件扩展名 它就会起作用 例子
  • OpenGraph 还是 Schema.org? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 只是想知道你们是否喜欢遵循以下标记的 OpenGraph 协议 或者 Schema org 协议 div span Kenmore White 17 Mi span div
  • 无法在 Ubuntu 13.04 上使用 RVM 安装 Ruby on Rails

    我正在尝试在我的 Ubuntu 机器上安装 RVM 我已经使用curl来获取RVM 但是一些RVM命令 安装 要求 抛出此apt get错误 There has been error while updating apt get pleas
  • Git-2-SVN 迁移?

    是的 我知道 为什么要从 Git 迁移到 SVN 好吧 我碰巧遇到这样的情况 我需要将一个巨大的 Git 存储库迁移到 Subversion 这是我根据埃德温的评论尝试的一个工作流程 首先创建一个本地SVN仓库 svnadmin creat
  • 通过推送通知启动应用程序时进行调试

    我目前正在开发一个接收推送通知的应用程序 我通过 PHP 页面使这一切 100 正常工作 我的应用程序可以接收多种不同类型的推送通知 PHP 处理这个问题并向我的应用程序发送不同的信息包 这些信息包都被很好地接收 但是 当用户 查看 通知并
  • 在类的构造函数中返回一个值

    到目前为止我有一个PHP带有构造函数的类 public function construct identifier NULL Return me if identifier NULL this gt emailAddress identif
  • 在 C++ 中寻找基于 Windows RAM 的共享内存解决方案

    我面临着一种情况 我需要将多达数百兆字节的内存从一个进程传递到另一个进程 现在我正在通过文件来完成它 但速度太慢了 我想为了更快 这些文件应该直接写入 RAM 并且可以从另一个进程访问 不需要花哨的同步 一个进程将创建共享内存对象并用数据填
  • 内容出现在固定标题后面

    我修复了网站的标题部分 但页面的第一个 div 出现在标题后面 而不是从标题的末尾开始 当您申请时position fixed or position absolute该元素将从文档流中删除 因此后面的元素将其视为不存在 这就是为什么你的d
  • 实体框架 nvarchar 外键区分大小写

    我有相当简单的表结构 如下所示 问题对我来说听起来很奇怪 虽然我选择解决这个问题 但想听取专家的意见 我有两张桌子 Users UserName nvarchar 250 Primary Key FirstName nvarchar 50
  • 为什么 Angular 5 中出现错误:没有导出成员“OpaqueToken”。?

    我有一个 Angular 4 应用程序 我正在将其升级到 Angular 5 我收到以下错误 src app application services generated variables ts 1 10 中出现错误 错误 TS2305
  • 处理控制器中的唯一记录异常

    我有一个名为 Subscription 的模型 它在字段 email location 上有唯一的索引 这意味着每个位置都可以通过一个电子邮件地址进行订阅 在我的模型中 class Subscription lt ActiveRecord
  • Angular 1.2 不再允许在同一元素上使用多个独立作用域指令?

    我在 Angular 项目中有一些代码 它们使用两个具有隔离范围的单独指令 它们不需要共享范围 只需存在于同一元素上即可 它们都以稍微不同的方式改变 DOM 并且重要的是绑定到作为参数传递的值 这在 1 0 中有效 但是 Angular 1
  • 即使“plist”中的“UIBackgroundModes”中存在“voip”,iOS 应用程序在 iOS10 中设备重新启动后也不会自动启动

    我需要我的 VoIP 应用程序在重新启动设备后自动启动 苹果文档明确提到 编辑 这是来自苹果官方文档 请在评论或回答没有用户交互或静默推送通知的情况下无法启动应用程序之前先看一下此内容 另请参阅下面的 Github 项目 人们已经验证了这种
  • 更改按键

    在输入框或 contenteditable true div 中 如何修改字母 a 的按键以返回字母 b 的按键 即 每次在 div 中键入字母 a 时 输出实际上是字母 b 我并不关心在 IE 中工作的解决方案 只是在 Safari Ch
  • 条件语句出现在表达式之前还是之后有什么关系吗?

    抱歉 如果这是一个愚蠢的问题 但我是一个在 ruby 中摸索的 C 人 在 ruby 中 我注意到很多人这样做 do something with params if 1 1 那个和这个之间有什么区别 哪怕是轻微的 if 1 1 do so
  • 在哪里可以找到 .cargo/config?

    我里面没有这个文件c user me cargo 如中所述货物文件 没有one的地方 cargo Cargo 允许对特定项目进行本地配置以及 全局配置 如 git Cargo 将其扩展为层次结构 战略 例如 如果调用 Cargo proje
  • 如何使用TIdIMAP4登录Gmail帐户并获取邮箱中的邮件数量?

    如何登录 Gmail 帐户并获取其中的邮件数量INBOX邮箱与TIdIMAP4成分 要获取 Gmail 收件箱中的邮件总数 您需要首先使用您的凭据连接到 Gmail IMAP 服务器 选择 Gmail 收件箱邮箱 然后为该选定邮箱读取Tot
  • 如何对数据库中的用户使用 Windows 身份验证 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我的主要目标是使用 Windows 身份验证来查询我的自定义用户表以通过 Web 应用程序使用 我不确定是否有常规方法可以做到这一点 我在 SQL 数据库中有一个预定义的用户表和
  • String.Format 计算预期参数的数量

    是否可以计算字符串中预期参数 参数的数量String Format 例如 Hello 0 Bye 1 应返回计数 2 我需要在之前显示错误string Format 抛出异常 感谢您的帮助 您可以使用正则表达式 例如 然后只计算匹配项 如果
  • 解压类型列表

    假设我有一个只接受类型模板参数的函数 我无法更改它的定义 实现 template lt typename T gt void do it 现在我有一个以通常的方式定义的类型列表 也无法更改它 template lt typename Ts