最后的手段/万能的/后备模板过载

2023-12-29

正如我之前提出的一个问题所示,重载解析、模板和继承 https://stackoverflow.com/questions/28405921/overload-resolution-templates-and-inheritance/28406090?noredirect=1#comment45149377_28406090,将在需要派生到基转换的重载之前选择模板重载。

但是,是否有一种方法可以提供后备过载,只有在没有其他匹配的情况下才选择该后备过载作为绝对的最后手段?在这种特殊情况下enable_if可以使用,但不幸的是不可扩展。

像这样:

// My library has this and has no knowledge of the possible overloads of foo
template<typename T>
void foo(const T &) { /* Do something */ }

// The user of the library provides this:
void foo(const UserBaseType &) { /* Do something */ }

// User calls foo with object derived from UserBaseType:
foo(UserDerivedType());

在这种情况下,我希望调用 UserBaseType 重载,而不是模板重载。


如果您愿意要求您的用户通过以下方式提供他们的定制点参数相关查找 (ADL) http://en.cppreference.com/w/cpp/language/adl,您可以通过众所周知的附加间接层来实现这一点。首先,可以通过提供最坏的可能回退并确定名称查找是否选择它来确定给定名称的 ADL 是否成功[*]:

namespace detail {
  // Simple trait that computes the inverse of std::is_same
  template <typename, typename>
  struct is_different : std::true_type {};
  template <typename T>
  struct is_different<T, T> : std::false_type {};

  // The ellipsis conversion is worse than any other
  // conversion, so overload resolution will choose
  // this declaration of foo only if there is no
  // result from ADL.
  struct tag;
  tag foo(...);

  // Trait that determines if ADL for foo(T) succeeds.
  template <typename T>
  using has_adl_foo =
    is_different<tag,decltype(foo(std::declval<T>()))>;
}

由于省略号转换严格比每个 [over.ics.rank]/2 的标准或用户定义的转换序列更差,因此任何合理的定制foo图书馆用户提供的会是更好的匹配。

然后,您需要一些机制在后备实现和用户提供的基于has_adl_foo trait:

namespace detail {
  // Fallback, used only if ADL fails.
  template <typename T>
  typename std::enable_if<!has_adl_foo<T>::value>::type
  impl(T&&) {
    std::cout << "Fallback\n";
  }

  // Dispatch to foo found by ADL.
  template <typename T>
  typename std::enable_if<has_adl_foo<T>::value,
    decltype(foo(std::declval<T>()))
  >::type
  impl(T&& t) {
    return foo(std::forward<T>(t));
  }
}

template <typename T>
auto foo(T&& t) ->
  decltype(detail::impl(std::forward<T>(t))) {
    return detail::impl(std::forward<T>(t));
}

然后,用户可以相当简单地提供他们的自定义 - 无论如何,与库命名空间中的专用模板相比,简单 - 通过声明foo在其类声明的命名空间中重载,ADL 可以在其中找到它们(DEMO http://coliru.stacked-crooked.com/a/2eab8717786a6d8c):

struct UserType {};
struct DerivedUserType : UserType {};

void foo(const UserType&) {
  std::cout << "User extension\n";
}

[*]: ADL Detection technique adapted from @T.C.'s answer https://stackoverflow.com/questions/26744589/what-is-a-proper-way-to-implement-is-swappable-to-test-for-the-swappable-concept/26852703#26852703 to What is a proper way to implement is_swappable to test for the Swappable concept? https://stackoverflow.com/questions/26744589/what-is-a-proper-way-to-implement-is-swappable-to-test-for-the-swappable-concept.

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

最后的手段/万能的/后备模板过载 的相关文章

  • Tensorflow 中的自定义资源

    由于某些原因 我需要为 Tensorflow 实现自定义资源 我试图从查找表实现中获得灵感 如果我理解得好的话 我需要实现3个TF操作 创建我的资源 资源的初始化 例如 在查找表的情况下填充哈希表 执行查找 查找 查询步骤 为了促进实施 我
  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 为什么基类必须有一个带有 0 个参数的构造函数?

    这不会编译 namespace Constructor0Args class Base public Base int x class Derived Base class Program static void Main string a
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • gdb 在 docker 上立即退出“进程已完成,退出代码 1”或 lldb“数据包返回错误 8”。另外:如何在 docker 中允许进行 C++ 调试

    这花了我一整天的时间才找到 所以我将其发布以供将来参考 我正在 docker 镜像上开发 C 我正在使用克利翁 我的代码是在调试模式下编译的 并且在运行模式下运行良好 但是当尝试调试时 进程会立即退出 并显示非常丰富的信息 Process
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • 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 文件中的原始文本 现在
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens

随机推荐

  • ASP.NET 代码块(例如 <%= %>)在页面生命周期中何时执行?

    当我对整个页面进行数据绑定时 我会执行以下操作 巴拉巴拉 这效果很好 但是 我通常不会对整个页面使用数据绑定 而是以 经典 ASP NET 方式编写内容 例如 在后面的代码中我将有类似的内容 lblSomeMessage Text Some
  • 在表单的 clean 方法期间读取文件数据

    所以 我正在努力实现答案我之前的问题 https stackoverflow com questions 2798670 processing file uploads before object is saved 这是我的模型 class
  • Visual Studio 2010 警告:未指定的错误(HRESULT 异常:0x80004005 (E_FAIL))

    我看到很多关于此错误的帖子 但似乎都与我的情况无关 我有一个小型解决方案 包含 2 个 winforms 应用程序和一个数据访问 DLL 我使用的是 VS2010 SP1 当我在 Vista Business 32 位 SP1 笔记本电脑上
  • 如何使用引导网格映射图像数组?

    我正在使用 gatsby js 构建一个投资组合网站 所有照片都发布在 WordPress 中 由 graphQL 获取并渲染到网站 我正在尝试使用 bootstrap grid 来组织照片并使其响应 但是因为 graphQL 返回一个数组
  • 为整个应用程序创建一个公共对象

    我创建了一项活动 用于创建用户个人资料并存储其信息 例如姓名 ID 个人资料图片等 该信息是唯一的 应该在应用程序的所有活动中使用 我想知道创建一个存储所有信息并在所有活动中使用它的通用对象的最佳方法是什么 我已阅读有关捆绑包和 JSON
  • Python - 使用 SAML 2.0 登录站点

    我很难找到资源来帮助我解决我遇到的问题 我有一个使用 SAML 2 0 保护的网站 有人可以向我指出显示如何使用 SAML 2 0 登录站点的资源吗 大多数 python 模块似乎都与实现 SAML 2 有关 我只需要登录到实现 SAML
  • 如何解析 REST 服务的 POST 参数?

    看来我还有另一个 JSON 问题 这次是在发布到 REST 服务时 我在用Flask Restful api add resource Records rest records
  • 如何使用 rand-int 生成可重复的随机序列

    我希望能够使用生成可重复的数字rand在 Clojure 中 具体来说 我想要调用的结果rand nth或Incanter的sample可重复 这些称为rand int这又调用rand 我想通了这个问题 https stackoverflo
  • 如何从静态方法访问控件?

    我有一个 C NET 应用程序 其中有一个MainForm和几节课 这些类之一接收来自网络的传入数据消息 我需要将这些消息的文本附加到多行文本框中MainForm 我可以将消息发送到中的方法MainForm通过使方法静态 但静态方法无法访问
  • 两个交互类的基于可变参数模板的多重继承...

    在我当前的项目中 我需要能够提供基于模板的多重继承 Mixin 模式 and有两个可以一起交互的类 具有镜像多重继承树 即一个类在同一继承级别使用另一个类的方法 长话短说 我似乎找不到一种优雅的方式来构建它 下面是一个简化的测试用例 您可以
  • 设置参考号并将其与文本文件中的其他数据进行比较

    该项目基于眼动仪 让我简要介绍一下该项目背后的想法 以便更好地理解我的问题 我有 Tobii C 眼动仪的硬件 这个眼动仪将能够给出我正在看的地方的 X Y 坐标 但这个装置非常敏感 当我看 1 个点时 眼动仪会发出许多不同的坐标数据 但在
  • Rails 应用程序内的 AMQP 订阅者

    是否可以使用我的 Rails 应用程序启动 AMQP 订阅者 可能通过初始化程序或其他东西 我想让它同时运行 也可以与 Rails 模型交互 下面是我的意思的伪代码示例 queue subscribe do msg body Foo cre
  • Asp 控制转发器内的 Id 生成

    我在中继器 itemtemplate 中定义了一些控件 问题出在自动生成的 Id 上 这是我的页面
  • 使用 CALayer 时无法编译代码

    由于某种原因 当我尝试使用 CALayer 时出现链接器错误 OBJC CLASS CALayer referenced from 我导入了以下标头 import
  • PropertyWrapper 中不存在的 Codable 属性的默认值

    我创建了一个像这样的propertyWrapper propertyWrapper public struct DefaultTodayDate Codable public var wrappedValue Date private le
  • 如何使用 JavaScript 将音频静音/取消静音

    我在这里创建了我的函数的小提琴 http jsfiddle net rhy5K 10 http jsfiddle net rhy5K 10 现在我想为用户提供声音 静音 取消播放 选项 例如 如果我点击 一个链接 那么声音就像Get rea
  • 为什么用“to_excel”保存时pandas数据框样式丢失?

    Per 这个例子 https pandas pydata org pandas docs stable user guide style html Export to Excel the to excel方法应保存带有背景颜色的 Excel
  • 显示“页面加载”消息

    我试图在 html 页面中显示用于 页面加载 的图像 gif 直到显示 my script py 的输出 但我不知道该怎么做 This http jsfiddle net 9X4gW 这是我到目前为止所得到的 提前谢谢了 HTML div
  • 使用反射从字符串获取属性值

    I am trying implement the Data transformation using Reflection https web archive org web 20210122135227 http geekswithbl
  • 最后的手段/万能的/后备模板过载

    正如我之前提出的一个问题所示 重载解析 模板和继承 https stackoverflow com questions 28405921 overload resolution templates and inheritance 28406