使用“void_t”检查类是否具有具有特定签名的方法

2023-11-24

此刻,我是使用此方法检查类是否具有具有特定签名的方法。

参加后Walter E. Brown 的元编程 CppCon2014 演讲,我开始想知道是否void_t可以在这种特殊情况下使用,以使代码更清晰、更具可读性。

但是我很难思考void_t- 到目前为止我明白了void_t可以帮助我在编译时确定表达式是否有效。

Example:

template< class, class = void >
struct has_type_data_member : false_type { };

template< class T >
struct has_type_data_member<T, void_t<decltype(T::data)>> : true_type { };

If decltype(T::type)是一个有效的表达式,has_type_data_member<T>将是一个真正的编译时常量。因此,我们确信T有一个名为的成员字段data.

我想使用相同的方法来检查类型是否T有一个具有特定名称和特定签名的方法。

假设我想检查是否T有一个方法叫做getCount()返回int。这就是我期望的工作((Ideone.com 链接)):

template< class, class = void >
struct hasGetCount : false_type { };

template< class T >
struct hasGetCount<T, VoidT<decltype(T::getCount)>> 
: std::is_same<decltype(std::declval<T>().getCount()), int>::type { };

不幸的是,static_assert测试没有通过。

我究竟做错了什么?是否可以使用void_t在这个情况下?

奖励问题:

  • 我还如何检查方法签名是否等于用户在原始实现中传递的签名?
  • 我可以使用宏来定义此类辅助结构,如下所示:

     DEFINE_METHOD_CHECKER(hasGetCount, getCount);
     // ...
     static_assert(hasGetCount<ClassWithGetCount>::value == true, "");
    

    是否可以避免定义一个struct首先然后检查结构的值?我的意思是,是否可以使用宏来编写这样的东西?例子:

     static_assert(CHECK_METHOD(ClassWithGetCount, getCount)::value == true, "");
    

首先,一个id-表达式命名非静态成员函数不能用作未计算的操作数(例如decltype)。此外,您应该检查整个函数调用表达式是否格式良好,而不仅仅是是否有一个名为的成员getCount:

template< class, class = void >
struct hasGetCount : false_type { };

template< class T >
struct hasGetCount<T, VoidT<decltype(std::declval<T>().getCount())>> 
: std::is_same<decltype(std::declval<T>().getCount()), int>::type { };

(Use declval<T&>如果你想检查一下getCount()可以在左值上调用。)

如果你只是检查是否存在getCount成员,那么如果具有该名称的成员存在但不可调用(例如,数据成员),则会出现硬错误。

尽管此时您不妨考虑使用类似的东西

template< class T >
struct hasGetCount<T, std::enable_if_t<std::is_same<decltype(std::declval<T>().getCount()), int>::value>> : std::true_type { };

而不是写decltype twice.

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

使用“void_t”检查类是否具有具有特定签名的方法 的相关文章

随机推荐

  • 利用多核的单线程程序

    Java程序的单线程可以自动使用CPU上的多个核心吗 Java程序的单线程可以自动使用CPU上的多个核心吗 是和不是 单线程Java程序将使用多个线程 因为GC JMX 终结器和其他后台线程可以在不同的CPU 无论是CPU还是核心 中运行
  • Javascript:自己的键函数中的对象文字引用而不是“this”

    在作为该文字一部分的函数中引用对象文字是否有问题 它似乎工作得很好 但我想确保没有其他影响 这是我正在谈论的一个例子 代替 var obj key1 it key2 function return this key1 works alert
  • JQuery 获取以字符串“whatever-”开头的元素类名的其余部分

    我有 js 缓存名称以 whatever 开头的类 class whatever class whatever 但我现在想做的是获取名称的其余部分 例如 在 whatever 9 的情况下 我想获取 9 我不知道该怎么做 你能帮助我吗 Tr
  • 如何在Expression.Or中设置2个以上的Expression

    我想创建一个包含超过 3 4 个表达式的查询 或者 但是表达式 或者只是让我在其中添加两个表达式 if string IsNullOrEmpty keyword query Add Expression Or Expression Like
  • Div 高度不会调整以适应内容

    如何使 div 水平和垂直居中并调整高度以适应内容 fiddle 这是我的 html 代码 div class sprite div div class content span close span div class centered
  • 在Qt中添加自定义字体

    有没有办法向 Qt 添加自定义字体 例如 Console Font 如何 我们如何将其设置为文本编辑器 QPlainTextEdit QTextEdit 等 Thanks Qt 使用您的窗口系统作为字体提供程序 您可以使用以下命令找到所有可
  • 如何从discord.py 中的文本通道获取所有消息的数组?

    我有频道对象 并且我已经尝试过 mess channel history limit 200 but mess is a HistoryIterator对象并且其内不包含任何消息mess messages对象 大小 0 频道中有消息 所以不
  • 如何获取BitBucket分支url?

    我有一个 bitbucket 存储库 我知道我可以单击 操作 选项卡 然后单击 克隆 以获取存储库的 http url 现在 我在存储库中有多个分支 并且我计划使用 Jenkins CI 从特定分支进行构建 有没有办法获取我的存储库中特定分
  • 如何将 powerpivot 数据作为表格复制到 Excel 工作簿中?

    我在 powerpivot 中有已修改的数据 我想将其作为常规表 而不是数据透视表 放入工作簿中 我需要这个 以便我可以使用该表来运行同一工作簿中另一个工作表中的一些 vlookups 我找到了这个答案 link我将尝试进行总结 而不会进行
  • JQuery 数据表行高

    我有一个页面 人们可以输入名字 姓氏 电话 电子邮件和种族 然后单击 添加 它会在数据表中添加一个条目 问题是点击添加后表格显示如下 如何调整每行的高度以使其正确显示 这是我的表的 html 代码 div div
  • 如何更改 JSF 2.0 中的语言环境?

    在我的应用程序中 用户应该能够切换区域设置 用于在页面上呈现文本的语言 大量教程都在使用 FacesContext getCurrentInstance getViewRoot setLocale 例如 http www mkyong co
  • Ionic 启动器无法在 crosswalk-lite 上运行:无法启动活动 ComponentInfo

    我正在使用 crosswalk lite 启动 ionic 应用程序 但它无法在真实设备和 genymotion 上运行 ionic start myApp tabs npm install bower install ionic serv
  • 查找小于其右侧某个元素的每个元素

    我需要找到一个向量中小于其后的多个元素之一的元素 在循环中很容易做到 x some vector values for m 1 length x if any x m 1 end gt x m do such and such end en
  • 为什么我的 HTTP Origin 标头与 request.base_url 不匹配以及如何修复?

    你好 这是我在这里的第一篇文章 我已经尝试调试这个问题几天了 但无法弄清楚 当我向 Rails api 发出发布请求时 我收到了以前从未见过的错误 Started POST owners for 1 at 2021 01 12 11 24
  • 图像旋转中的背景透明度()

    自过去 2 天以来 我尝试使用 imagerotate PHP GD 函数旋转图像后为背景添加透明度 但是 令我非常失望的是 它根本不起作用 它只是在其背后提供黑色背景 这是我的代码 patchImageS image png the im
  • 如何为所有屏幕的 iPhone 应用程序添加垂直滑动手势?

    我想向我的应用程序添加一个手势 以便当用户垂直滑动时它会触发一个方法来执行某些操作 滑动可以向上或向下 我从来没有用手势做过任何事情 所以这是我第一次使用手势 而不是 UITableView 中包含的用于删除行的手势 另一个问题是我的大多数
  • 使用 R 查找字符串中的重复模式

    我有一个很大的文本 其中包含以下表达式 aaaahahahahaha that was a good joke 处理后 我想要 aaaaahahahaha 消失 或者至少将其更改为简单 ha 目前 我正在使用这个 gsub 1 str 当带
  • JQuery:如何找出一个元素有多少个子元素?

    如何使用 jQuery 找出一个元素有多少个子元素 假设我有以下结构 div div div div div div div div div div div div div div 我想知道 div 元素 container 有多少个子元素
  • 在 python 解释器提示符中添加颜色,无法正确换行

    我希望在终端中有一个更丰富多彩的 Python 提示符 只是为了便于阅读 我目前有 sys ps1 033 96m gt gt gt 033 0m sys ps2 033 96m 033 0m in my PYTHONSTARTUP文件 它
  • 使用“void_t”检查类是否具有具有特定签名的方法

    此刻 我是使用此方法检查类是否具有具有特定签名的方法 参加后Walter E Brown 的元编程 CppCon2014 演讲 我开始想知道是否void t可以在这种特殊情况下使用 以使代码更清晰 更具可读性 但是我很难思考void t 到