如何检查函数模板是否已专门化?

2023-11-23

有没有办法在编译时确定某个函数模板是否是专门的?

例如,假设有以下函数模板:

template<size_t N>
void foo();

我想测试一下是否foo<42>是专业化的。请注意,上面的声明不包含任何默认实现。

我尝试了 SFINAE,但找不到编译器无法从其声明中推断出的函数条件。


如果某个模板函数是专门化的,有没有办法在编译时确定?

有一个功能...我不这么认为。

但是如果你创建一个函子,你可以添加一个静态常量成员(is_specialized,在以下示例中)可以为您提供此信息

#include <iostream>

template <std::size_t N>
struct foo
 {
   static constexpr bool is_specialized { false };

   void operator() () const
    { std::cout << "- generic (" << N << ") foo struct" << std::endl; }
 };

template <>
struct foo<42U>
 {
   static constexpr bool is_specialized { true };

   void operator() () const
    { std::cout << "- specialized (42) foo struct" << std::endl; }
 };

int main()
 {
   foo<17U>()(); // print - generic (17) foo struct
   foo<42U>()(); // print - specialized (42) foo struct

   std::cout << foo<17U>::is_specialized << std::endl; // print 0
   std::cout << foo<42U>::is_specialized << std::endl; // print 1
 }

- - 编辑 - -

根据昆汀的建议(再次感谢!),我开发了另一个基于函子的解决方案,它使用某些东西来检测函子是通用的还是专用的,仅在通用函子中添加。在这种情况下,用类型代替bool持续的。

template <std::size_t N>
struct foo
 {
   // im_not_specialized is added only in the generic version!
   using im_not_specialized = void;

   void operator () () const
    { std::cout << "- generic (" << N << ") foo struct" << std::endl; }
 };

template <>
struct foo<42U>
 {
   void operator () () const
    { std::cout << "- specialized (42) foo struct" << std::endl; }
 };

这种类型可以通过 SFINAE 使用,我提出了一个基于constexpr isSpecialized()模板函数(带有辅助函数)

template <typename F>
constexpr bool isSpecializedHelper
      (int, typename F::im_not_specialized const * = nullptr)
 { return false; }

template <typename F>
constexpr bool isSpecializedHelper (long)
 { return true; }

template <typename F>
constexpr bool isSpecialized ()
 { return isSpecializedHelper<F>(0); }

这需要更多的工作,但是isSpecialized()可以与不同的函子重用(im_not_specialized基于类型)

以下是一个完整的工作示例

#include <iostream>

template <std::size_t N>
struct foo
 {
   // im_not_specialized is added only in the generic version!
   using im_not_specialized = void;

   void operator () () const
    { std::cout << "- generic (" << N << ") foo struct" << std::endl; }
 };

template <>
struct foo<42U>
 {
   void operator () () const
    { std::cout << "- specialized (42) foo struct" << std::endl; }
 };

template <typename F>
constexpr bool isSpecializedHelper
      (int, typename F::im_not_specialized const * = nullptr)
 { return false; }

template <typename F>
constexpr bool isSpecializedHelper (long)
 { return true; }

template <typename F>
constexpr bool isSpecialized ()
 { return isSpecializedHelper<F>(0); }

int main()
 {
   foo<17U>()(); // print - generic (17) foo struct
   foo<42U>()(); // print - specialized (42) foo struct

   constexpr auto isSp17 = isSpecialized<foo<17U>>();
   constexpr auto isSp42 = isSpecialized<foo<42U>>();

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

如何检查函数模板是否已专门化? 的相关文章

  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 是否有任何 jquery 功能可以以与 DOM 类似的方式查询多维数组?

    问题说了什么 jQuery 是否有任何方法可以让您以与 DOM 类似的方式查询多维对象数组 例如 获取一个多维数组中包含的对象列表 该数组具有一些匹配的属性值 例如 其中 StartOfPeriod 大于指定日期或 name Ben Ala
  • Objective-C 串口 - Mac OS X

    我目前正在终端中运行以下命令 通过 USB 串行发送命令 Users drummerboyx Library Scripts arduino serial b 9600 p dev tty usbserial A800ev0Z s 1 Ob
  • 使用 AJAX(不是表单)更新 Rails 3 部分

    我发现了一些关于提交表单后使用 Ajax 更新部分内容的问题和答案 但我的问题是 更简单 我只想每隔几秒重新加载一部分并加载新数据 这真的一点也不难 我记得在 Rails 2 3 中做过类似的事情 但我在任何地方都找不到答案 基本上 我有一
  • junit 测试中的 spring-data-jpa bean 验证

    在我最近的工作中 我使用 spring data jpa 来利用提供的存储库 当涉及到集成测试时 我无法配置 我假设 用于测试的 spring 上下文 因此 bean 验证在我的测试中不起作用 我知道我可以注入验证器 并对我的注释进行单元测
  • Oracle 在 DATE 使用 LIKE '%'

    我的桌子myTab有专栏startDate 其数据类型为 DATE 该列中的数据存储方式如下dd mm yyyy 现在我尝试使用此查询获取数据 SELECT FROM myTab WHERE startDate like 01 2015 不
  • 如何在Tlistview中基于subitem[x]排序

    如何排序tlistview数据存在于subitem x Set SortType stData和写 procedure TForm1 ListView1Compare Sender TObject Item1 Item2 TListItem
  • 无法在 PyQt5 中导入 QtWebKitWidgets

    我最近使用 Windows 32 位安装程序将 PyQt5 从 5 5 1 升级到 5 6 0 https www riverbankcomputing com software pyqt download5 我还将我的 python 从
  • Android 音频 SeekBar

    我正在尝试创建一个可以播放单个音频文件并且可以使用进度 搜索栏暂停和操作的东西 我想要一个图像占据大部分屏幕 然后在左下角有一个播放暂停按钮 在按钮右侧有一个栏 一切都在搜索栏上运行 但未链接到音频 我的进度条编码可能是一团糟 因为如果从我
  • 将多个域添加到 azure 网站

    我正在将一个相当重要的多租户应用程序迁移到 Azure 我看到的挑战之一是它托管着一百多个域 在 Azure 方面 我认为添加自定义域的唯一方法是通过门户手动输入它们 我真的很想使用 Azure PowerShell 或 对于这种一次性操作
  • 如何获取 Win32 中的 CPU 周期数?

    在 Win32 中 有没有办法获得唯一的 cpu 周期计数或类似的东西 对于多个进程 语言 系统 等来说是统一的 我正在创建一些日志文件 但必须生成多个日志文件 因为我们托管 NET 运行时 并且我希望避免从一个日志文件调用另一个日志文件来
  • iOS 5 + GLKView:如何访问像素 RGB 数据以进行基于颜色的顶点拾取?

    我一直在转换我自己的个人 OGLES 2 0 框架 以利用新的 iOS 5 框架添加的功能GLKit 在获得令人满意的结果后 我现在希望实现所描述的基于颜色的拾取机制here 为此 您必须访问后台缓冲区以检索触摸的像素 RGBA 值 然后将
  • 如何下载 XML 文件避免弹出窗口这种类型的文件可能会通过 ChromeDriver 和 Chrome 使用 Python 中的 Selenium 损害您的计算机

    我想从供应商处下载每日 xml 文件 我成功登录并单击链接 接受下载 以开始使用 chromedriver 下载 但我收到弹出窗口 这种类型的文件可能会损害您的计算机 页面的 MIME 是 text html 我不确定链接是否是 text
  • 一个简单的 Java SOAP 客户端

    我是 Web 服务的新手 并且一直在绞尽脑汁地试图在 Internet 上找到一个简单的 Java SOAP 客户端程序 我想做的就是发送一条 SOAP 消息并接收一些响应 有一个提供免费网络服务的网站 您输入国家 地区名称 它就会为您提供
  • 使用 Puppeteer 绕过 Cloudflare

    我正在尝试使用我的 Puppeteer 进入 hotbit io 但当 puppeteer 尝试进入页面时 我遇到了 在访问 www hotbit io 之前检查您的浏览器 当我以 headless false 运行程序时 它会在 5 秒后
  • 运算符“!=”不能应用于“Task”和“int”类型的操作数

    最近我开始使用 Xamarin 创建 Android 应用程序 我尝试使用 SQLite 创建一个小型本地数据库 我使用了以下教程Xamarin 文档网站 不幸的是我收到一个错误 错误 CS0019 运算符 无法应用于类型 Task 和 i
  • 为什么位字节顺序是位字段中的一个问题?

    任何使用位域的可移植代码似乎都会区分小端和大端平台 请参阅Linux内核中struct iphdr的声明此类代码的示例 我根本不明白为什么位字节顺序是一个问题 据我了解 位域纯粹是编译器构造 用于促进位级操作 例如 考虑以下位字段 stru
  • Java 中的表单加载事件处理程序是什么?

    Java 中类似于 C 中的 From Load 的事件处理程序 使用 net beans 是什么 如果您使用 Swing 的 JFrame 请尝试使用 addWindowListener 继承自 java awt Window 侦听器的
  • WebSockets 还是带有phonegap 的替代方案?

    如何使用phonegap 将低延迟数据发送到服务器并返回 考虑到我无法在本地访问 php 文件 并且没有使用 node js 或 WebSockets 的经验 我不知道应该使用哪些 Android 或 Android 中的浏览器本身不支持
  • 自定义 dealloc 和 ARC (Objective-C)

    在我的 iPad 小应用程序中 我有一个使用观察者的 切换语言 功能 每个视图控制器在其期间都会向我的观察者注册自己viewDidLoad void viewDidLoad super viewDidLoad observer regist
  • 如何检查函数模板是否已专门化?

    有没有办法在编译时确定某个函数模板是否是专门的 例如 假设有以下函数模板 template