C++ 可变参数模板 匹配任何类型参数的模板实参

2024-04-13

我想知道是否可以编写一个模板函数,该函数可以将任何其他任意模板作为参数并正确匹配模板名称(即不仅仅是结果类)。我所知道的工作是这样的:

template<template<typename ...> class TemplateT, typename... TemplateP>
void f(const TemplateT<TemplateP...>& param);

例如,它将匹配f(std::vector<int>()) or f(std::list<int>())但不会为f(std::array<int, 3>()),因为第二个参数是size_t并且没有类型。

现在我想人们可以做一些疯狂的事情,比如:

template<template<typename ...> class TemplateT, size... Sizes, typename... TemplateP>
void f(const TemplateT<Sizes..., TemplateP...>& param);

希望编译器能够正确导出TemplateP省略号或Sizes省略号为空。但它不仅丑陋,而且仍然只适用于采用类型或类型的模板size_t参数。它仍然不会匹配任意模板,例如bool参数。

重载方法也是如此:

template<template<typename ...> class TemplateT, typename... TemplateP>
void f(const TemplateT<TemplateP...>& param);

template<template<typename ...> class TemplateT, size... Sizes>
void f(const TemplateT<Sizes...>& param);

此外,如果我们想混合,这种方法将不起作用size_t and typenames。因此,匹配任何内容所需的内容将是这样的,其中省略号中允许的内容根本没有任何限制:

template<template<...> class TemplateT, ... Anything>
void f(const TemplateT<Anything...>& param);

该语法不起作用,但也许还有其他语法来定义这样的东西?

这主要是我想知道该语言有什么可能,认为它实际上可能有用,如果您有不同的模板,其中第一个参数始终是固定的,并且您想根据返回类型更改它并保留其他所有内容。像这样的事情:

template<
    template<typename ValueT, ...> class TemplateT,
    ... Anything,
    typename ValueT,
    typename ResultT = decltype(some_operation_on_value_t(std::declval<ValueT>())>
TemplateT<ResultT, Anything...> f(const TemplateT<ValueT, Anything...>& in);

那么,有什么方法可以使用模式匹配以完全通用的方式使其工作吗?

这不仅仅是一个思想实验,因为我陷入困境的用例是创建在容器上操作的纯函数原语,并将隐式构造不可变的结果容器。如果结果容器具有不同的数据类型,我们需要知道容器操作的类型,因此对任何容器的唯一要求是模板的第一个参数需要是输入类型,以便可以将其替换为不同的类型结果中的输出类型,但代码应该忽略此后出现的任何模板参数,并且不应该关心它是类型还是值。


您有趣的构造有两个带有可变参数模板的级别。

  • 外部可变参数模板参数列表TemplateP & Sizes for a 函数模板
  • 一个内部参数包作为你的模板模板参数的模板参数TemplateT, a 类模板

首先我们来看看内部TemplateT类:为什么省略号运算符不能不匹配类似的东西TemplateT< int, 2 >?那么,该标准在 §14.5.3 中将可变参数模板定义为

template<class ... Types> struct Tuple { };
template<T ...Values> struct Tuple2 { };

其中第一种情况下的模板参数包可能only匹配类型和第二个版本only类型的值T。尤其,

Tuple < 0 >    error;  // error, 0 is not a type!
Tuple < T, 0 > error2; // T is a type, but zero is not!
Tuple2< T >    error3; // error, T is not a value
Tuple2< T, 0 > error4; // error, T is not a value

都是畸形的。此外,不可能退回到类似的情况

template<class ... Types, size_t ...Sizes> struct Tuple { };

因为该标准在 §14.1.11 中规定:

如果主类模板或别名模板的模板参数是模板参数包,则它 应是最后一个模板参数。不能遵循函数模板的模板参数包 由另一个模板参数除非可以从参数类型列表中推导出该模板参数 函数模板的或有默认参数 (14.8.2)。

换句话说,仅适用于类模板one可变参数包可能出现在定义中。因此,上面的(双)可变参数类定义是错误的。因为内部类总是需要这样的组合,所以不可能写出像你想象的那么通用的东西。


还能挽救什么?对于外部功能模板,可以将一些分片放在一起,但你不会喜欢它。只要可以从第一个参数包推导出第二个参数包,就可能会出现两个参数包(在函数模板中)。因此,像这样的函数

template < typename... Args, size_t... N > void g(const std::array< Args, N > &...arr);
g(std::array< double, 3 >(), std::array< int, 5>());

是允许的,因为可以推导出整数值。当然,这必须专门针对每种容器类型,并且与您的想象相去甚远。

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

C++ 可变参数模板 匹配任何类型参数的模板实参 的相关文章

  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 为什么基类必须有一个带有 0 个参数的构造函数?

    这不会编译 namespace Constructor0Args class Base public Base int x class Derived Base class Program static void Main string a
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • VS30063:您无权访问 https://dev.azure.com

    我正在尝试在 asp net core 2 1 mvc 应用程序中使用以下代码连接 Azure DevOps Uri orgUrl new Uri https dev azure com xxxxx String personalAcces
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • 如何使用 std::array 模拟 C 数组初始化“int arr[] = { e1, e2, e3, ... }”行为?

    注意 这个问题是关于不必指定元素数量并且仍然允许直接初始化嵌套类型 这个问题 https stackoverflow com questions 6111565 now that we have stdarray what uses are

随机推荐

  • 使用 sllauncher 安装 Silverlight 4 应用程序不起作用

    我正在尝试使用 sllauncher 离线安装 XAP 文件 但它不起作用 UPDATE 我删除了应用程序的所有现有引用和文件夹 现在它似乎可以正常工作 我将保留这个 因为它有一些关于如何解决这个问题的好线索 C Documents and
  • 如何使用 /htdocs 目录结构中的文件设置 SVN

    我在处理 php 文件时如何设置 Subversion 时遇到了一个小问题 我将所有文件存储在 c www nameOfProject htdocs 中 并为每个项目设置虚拟主机 c www project1 htdocs index ph
  • 响应式菜单/小型设备:单击菜单项时关闭/折叠菜单

    我想更改小型设备上 Twitter 引导菜单的行为 以通过单击菜单项或单击菜单按钮来关闭展开的菜单 目前 默认 我只能通过单击右上角的菜单按钮来折叠它 无论我是否单击了链接 菜单项 我该怎么做呢 我无法从 TB 文档中弄清楚这一点 并且在互
  • 这个递归 SQL CTE 究竟是如何工作的?

    有人可以向我解释一下这个 SQL 查询到底是如何工作的吗 WITH recursive n n AS SELECT 2 n UNION ALL SELECT n 1 FROM n WHERE n lt 1000 SELECT a n FRO
  • 有没有办法在转码之前使用 ffmpeg 确定文件的编码?

    我计划使用 ffmpeg 确保上传到我网站的所有视频文件都编码为 mp4 h264 我不想自动处理每个文件 而是希望通过仅处理那些还不是 mp4 h264 的文件来最小化处理开销 有没有一种简单的方法可以使用 ffmpeg 或其他命令行实用
  • 如何判断一个文件是否可以删除?

    我怎么能够check我可以用Java删除文件吗 例如 如果一个文件test txt在另一个程序中打开我无法删除它 我必须在实际删除之前知道它 所以我不能这样做 if file delete And srcFile canWrite 也不工作
  • 在 ES6 生成器函数中使用 return

    我无法弄清楚如果您使用 return 语句而不是 Yield 会发生什么 function gen const val yield someAsyncFn assert equal val 4 return val 回报率与收益率有何不同
  • Visual Studio代码侧边栏垂直引导线(自定义侧边栏)

    有人知道 Visual Studio 代码的扩展可以像 netbeans 一样在侧边栏 用于文件和文件夹 上显示垂直指南吗 或者vscode中有一些设置吗 Netbeans 快照 https i stack imgur com CFJsw
  • .Net 哪里可以找到 BinaryFormatter 序列化格式的官方规范?

    我想知道BinaryFormatter的序列化格式是什么 我发现这个网站 http primates ximian com lluis dist binary serialization format htm其中提供了一些很好的信息 但它是
  • Applescript 获取正在运行的应用程序列表?

    Applescript 新手问题又来了 我正在尝试创建一个小 applescript 它允许我从当前运行的应用程序列表中选择多个项目 然后退出这些选定的应用程序 像这样的东西是可行的 但不必单击每个对话框 从列表中进行选择会更容易 tell
  • 将 jQuery 脚本与 Angular 6 CLI 项目结合使用

    我正在使用 Angular 6 开发一个应用程序 我的应用程序使用明顿主题 http coderthemes com minton dark index html 我将所有主题脚本包含在index html我的角度项目的文件 但是当我登录或
  • 我们可以使用 python 生成卡方检验的列联表吗?

    我正在使用 scipy stats chi2 contingency 方法来获取卡方统计数据 我们需要传递频率表 即列联表作为参数 但我有一个特征向量 想要自动生成频率表 我们有这样的功能吗 我目前正在这样做 def contigency
  • PHP OOP MySQL 编程

    我是 PHP 编程的初学者 需要帮助解决一个小问题 请看下面的代码 PHP Code
  • Android 8.0 Oreo - 帐户

    在我的应用程序中 我需要知道是否有任何 Google 帐户或任何三星帐户 在 Android 7 之前 可以通过以下方式轻松获取此信息 Account accounts AccountManager get getContext getAc
  • 如果没有结果,如何停止 grep 创建空文件

    我正在比较两个文件的结果 其中一个文件中的行不在另一个文件中 使用grep v f file1 txt file2 txt gt result txt 假设我的文件看起来像 文件1 txt alex peter zoey 文件2 txt a
  • 在 proguard 之后运行 espresso 测试

    我正在寻找一种在 proguard 运行后运行我的 espresso 测试的方法 这应该是一个针对配置错误的 proguard 的安全网 只是在将 butterknife 更新到 7 0 后忘记更新 proguard 配置 假设您使用 An
  • 垂直对齐:基线在 Chrome 中不起作用

    老实说 我有一个非常愚蠢的问题 不管怎样 就到这里吧 我一直在尝试使用垂直对齐 基线 这本身就起作用 问题是它可以在 IE 和 Firefox 中运行 我的问题是 由于某些奇怪的原因 它在 Chrome 中不起作用 chrome 中问题的屏
  • 正则表达式用标签包装文本[重复]

    这个问题在这里已经有答案了 我需要一个 JavaScript 正则表达式来包装 hashtags span tags Example 之前 我需要 help 请 Thanks 之后 我需要 span help span 请 span Tha
  • Spring Boot 注解 @GetMapping 无法解析为类型

    我第一次尝试在本地计算机上从 Spring Initializr 创建 Spring 项目 但我收到这些错误 GetMapping 无法解析为类型 我的 pom xml 文件
  • C++ 可变参数模板 匹配任何类型参数的模板实参

    我想知道是否可以编写一个模板函数 该函数可以将任何其他任意模板作为参数并正确匹配模板名称 即不仅仅是结果类 我所知道的工作是这样的 template