我们可以使用检测惯用法来检查类是否具有具有特定签名的成员函数吗?

2023-12-28

鉴于(减少)实施检测惯用语 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4502.pdf

namespace type_traits
{
    template<typename... Ts>
    using void_t = void;

    namespace detail
    {
        template<typename, template<typename...> class, typename...>
        struct is_detected : std::false_type {};

        template<template<class...> class Operation, typename... Arguments>
        struct is_detected<void_t<Operation<Arguments...>>, Operation, Arguments...> : std::true_type {};
    }

    template<template<class...> class Operation, typename... Arguments>
    using is_detected = detail::is_detected<void_t<>, Operation, Arguments...>;

    template<template<class...> class Operation, typename... Arguments>
    constexpr bool is_detected_v = detail::is_detected<void_t<>, Operation, Arguments...>::value;
}

我们可以很容易地检查一个类是否foo包含一个成员函数bar

struct  foo {
    int const& bar(int&&) { return 0; }
};

template<class T>
using bar_t = decltype(std::declval<T>().bar(0));

int main()
{
    static_assert(type_traits::is_detected_v<bar_t, foo>, "not detected");
    return 0;
}

然而,正如你所看到的,我们无法检测到foo::bar的参数类型是int&&。检测成功,原因0可以传递给foo::bar。我知道有很多选项可以检查exact(成员)函数的签名。但我想知道是否可以修改此检测工具包以检测到foo::bar的参数类型正是int&&.

[我创建了一个现场演示 http://coliru.stacked-crooked.com/a/207d4486edb89ac3这个例子。]


在不改变你的 type_traits 的情况下,你可以这样做

template<typename T, T> struct helper {};

template<class T>
using bar_t = decltype(helper<const int& (T::*)(int&&), &T::bar>{});

Demo http://coliru.stacked-crooked.com/a/f2048463030d5241

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

我们可以使用检测惯用法来检查类是否具有具有特定签名的成员函数吗? 的相关文章

随机推荐

  • 在 32 位应用程序中使用 64 位整数可以吗?

    我注意到在 C 和 C 中 我们可以使用int64 t 或者只是一个long long 如果我编译32位代码使用这些类型 我会遇到任何性能问题吗64bit and or 32位机器 除了节省一些内存之外 我还有理由只使用int 毕竟 64
  • Postgresql 的函数

    在这个网站上我看到了一个函数 我想将其与 postgresql 一起使用 https raresql com 2013 05 16 sql server excel financial functions pmt https raresql
  • Angular 12 库源映射不可用

    升级到 Angular 12 后 自定义 Angular 库组件的源映射不再可用于调试 这是一部分angular json来自使用该库的 Angular 应用程序模块 projects myapp build configurations
  • 使用 POST 而不是 GET 的 REST API

    假设某个服务提供了一些我可以像这样使用的功能 GET service function param1 value1 param2 value2 我可以将它与 POST 查询一起使用吗 POST service function param1
  • 如何在PyQt4中用动画画一条线

    我有一个要点清单 例如 points 160 75 115 567 How to draw a line in PyQt4 so it would be something like this 提前致谢 EDIT For the recor
  • Java 获取 java.lang.Number 或原语的通用子类的 valueOf

    在阅读了很多问题后 我问自己是否可以解决将字符串转换为通用数字而不使用硬编码方法的困境 例如 我从方法中获取类型为 Class 的参数 使用 Number isAssignableFrom 或其他方式我可以检查这是否是一个数字类 但我也从用
  • Lua忽略转义序列

    目前Lua有以下转义序列 a Bell b 退格键 f 换页 n 新队 r 回车 t Tab v 垂直制表符 反斜杠 双引号 单引号 nnn 八进制值 nnn 是 3 个八进制数字 xNN 十六进制值 Lua5 2 LuaJIT NN是两个
  • 使用元素自己的宽度分配左边距

    我想设置margin left元素宽度的负一半 这会获取文档的宽度 services backPanel gt div css margin top this height 2 margin left this width 2 我究竟做错了
  • WebBrowser-Control - 单击链接打开默认浏览器

    我在 WPF 应用程序中使用 WebBrowser Control 例如
  • React/Redux 架构中 API 调用应该放在哪里?

    我正在尝试从 API 检索一些数据并将其传递到我的应用程序中 然而 作为 React Redux 的新手 我想知道从哪里进行这些调用以及如何将其传递到我的应用程序中 我有标准的文件夹结构 组件 减速器 容器等 但我不确定现在将 API 调用
  • 导出 Web 项目

    我使用 java 页面和 eclipse 制作了一个 Web 应用程序 但我不知道如何导出它以供使用 我被要求提供一个 make 文件或其他东西 我还可以通过哪些其他方法从 eclipse 执行此操作 听起来您需要将其导出为 WAR 文件
  • 计算函数极限的最佳方法是什么?

    我计划开发一个应用程序 可以计算用户给出的表达式 函数 的极限 I already have a functional expression evaluator which will definitely come in handy My
  • 为什么 Pylint 认为在条件值中使用 len(SEQUENCE) 不正确?

    考虑这个代码片段 from os import walk files for dirpath filenames in walk mydir More code that modifies files if len files 0 lt C
  • 算术左移时间复杂度

    是什么时间复杂度of 算术左移 n 位操作数的算术右移 运算符 例如 x y 复杂度 用 O 表示法 是当输入大小变得越来越大时算法所花费的时间的渐近特征 对于只能接受有限数量输入的算法来说毫无意义 lt lt 可以采用 2 32 32 个
  • 仅倾斜前后的一侧以获得平箭头

    我创建了一些虚拟的面包屑步骤 第一个面包屑步骤需要在左侧有一个正常的平坦边框 这已完成 悬停时 我需要显示每个面包屑项目的黑色边框 但唯一的问题是悬停时 对于第一个面包屑步骤 我没有像预期的那样在左侧得到平坦的边框 以下是悬停时的预期结果
  • 如何让 Spotify 和其他 Android 音乐应用程序按意图搜索和播放?

    我想创建一个MEDIA PLAY FROM SEARCH https developer android com guide components intents common html PlaySearch 或其他 意图 将在任何主要 A
  • 等待 AJAX 调用 (POST) 完成

    我正在使用 jQuery UI 选项卡 其中每个选项卡都有不同的表单 用户输入各种数据后 他们提交整组选项卡 以便每个选项卡异步发布到服务器 这运作良好 我在这里没有任何问题 然而 我遇到的问题是 我发布的最后一个表单必须在所有其他帖子完成
  • 正则表达式仅适用于第一次出现? [复制]

    这个问题在这里已经有答案了 假设我有以下字符串 这是一个测试 测试 这只是一个测试 结束 我想选择this is a test and this is only a test 我到底需要做什么 我尝试的以下正则表达式产生了一个愚蠢的结果 t
  • Angularjs 多个指令 [gridsection, gridsection] 要求模板:

    我收到错误 Multiple directives gridsection gridsection asking for templateon div 用这个代码 我不明白我是如何使用嵌套指令的或者是什么导致了这个 html页面 div d
  • 我们可以使用检测惯用法来检查类是否具有具有特定签名的成员函数吗?

    鉴于 减少 实施检测惯用语 http www open std org jtc1 sc22 wg21 docs papers 2015 n4502 pdf namespace type traits template