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

0xbadf00d

给出(减少)检测惯用语的实现

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我知道有很多选项可以检查(成员)函数确切签名。但我想知道,是否有可能修改此检测工具包以检测该foo::bar参数类型是否为int&&

[我已经创建了这个示例现场演示。]

0xbadf00d

适应dypJarod42的想法,我想到

template<class T, typename... Arguments>
using bar_t = std::conditional_t<
    true,
    decltype(std::declval<T>().bar(std::declval<Arguments>()...)),
    std::integral_constant<
        decltype(std::declval<T>().bar(std::declval<Arguments>()...)) (T::*)(Arguments...),
        &T::bar
    >
>;

注意,这bar_t将是bar调用的返回类型这样,我们与工具包保持一致。我们可以通过以下方式检测存在

static_assert(type_traits::is_detected_v<bar_t, foo, int&&>, "not detected");

但是,尽管此解决方案完全符合我的预期,但我讨厌为每种要检测的方法编写“非常复杂的代码”。我问了一个针对这个问题问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我们不能从initializer_list创建std :: array,但是我们可以使用带有可变参数的辅助函数来创建它吗?

来自分类Dev

我们可以使用带有字母数字字符的班级名称吗?

来自分类Dev

使用friend函数,我们可以覆盖该类的私有成员吗?

来自分类Dev

我们可以使用反射调用抽象类的私有方法吗?

来自分类Dev

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

来自分类Dev

我可以使用LINQ来检查列表中的对象是否具有唯一ID吗?

来自分类Dev

我们可以使用 jquery 定位具有 (data-toggle="collapse") 属性且没有类的元素吗?

来自分类Dev

我们可以使用Java关键字来命名类吗?

来自分类Dev

我们可以使用Union-Find数据结构检测有向图中的周期吗?

来自分类Dev

我们可以使用RTTI来按名称查找函数/过程并运行它们吗?

来自分类Dev

我们不能从initializer_list创建std :: array,但是可以使用带有可变参数的辅助函数来创建它吗?

来自分类Dev

我们可以使用现有的OWASP ZAP会话来测试新版本吗?

来自分类Dev

在 sshd_config 中提到“AuthorizedKeysFile”时,我们可以使用通配符来拥有多个路径吗?

来自分类Dev

我们可以通过拥有非私有instanceName来创建Singleton类吗?

来自分类Dev

为什么我们可以使用指针访问私有数据成员类,而不使用类中的其他成员,朋友功能?

来自分类Dev

我们可以在C ++类的成员函数中使用cin >>吗?

来自分类Dev

我们可以使用类作为标题吗

来自分类Dev

SOLR日光浴室我们可以使用带有maxmax查询的过滤查询吗?

来自分类Dev

我们可以使用list.map调用具有多个参数的方法吗?

来自分类Dev

使用检测习惯用法确定类型是否具有带有特定签名的构造函数

来自分类Dev

使用检测习惯用法确定类型是否具有带有特定签名的构造函数

来自分类Dev

我们可以获取扩展特定类的所有类吗

来自分类Dev

使用概念或SFINAE检查类是否具有带有std :: array参数的模板化成员函数

来自分类Dev

我们可以在python程序中多次使用带有某些参数的用户定义函数吗?

来自分类Dev

我们可以用具有扩展方法的接口替换抽象类吗?

来自分类Dev

我们可以配置具有多个DAO的服务类吗?

来自分类Dev

我们可以用具有扩展方法的接口替换抽象类吗?

来自分类Dev

我们可以在Android中加载带有某些特定文本的Autocomplete TextView吗?

来自分类Dev

您可以使用函数生成具有唯一成员的类的实例吗?

Related 相关文章

  1. 1

    我们不能从initializer_list创建std :: array,但是我们可以使用带有可变参数的辅助函数来创建它吗?

  2. 2

    我们可以使用带有字母数字字符的班级名称吗?

  3. 3

    使用friend函数,我们可以覆盖该类的私有成员吗?

  4. 4

    我们可以使用反射调用抽象类的私有方法吗?

  5. 5

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

  6. 6

    我可以使用LINQ来检查列表中的对象是否具有唯一ID吗?

  7. 7

    我们可以使用 jquery 定位具有 (data-toggle="collapse") 属性且没有类的元素吗?

  8. 8

    我们可以使用Java关键字来命名类吗?

  9. 9

    我们可以使用Union-Find数据结构检测有向图中的周期吗?

  10. 10

    我们可以使用RTTI来按名称查找函数/过程并运行它们吗?

  11. 11

    我们不能从initializer_list创建std :: array,但是可以使用带有可变参数的辅助函数来创建它吗?

  12. 12

    我们可以使用现有的OWASP ZAP会话来测试新版本吗?

  13. 13

    在 sshd_config 中提到“AuthorizedKeysFile”时,我们可以使用通配符来拥有多个路径吗?

  14. 14

    我们可以通过拥有非私有instanceName来创建Singleton类吗?

  15. 15

    为什么我们可以使用指针访问私有数据成员类,而不使用类中的其他成员,朋友功能?

  16. 16

    我们可以在C ++类的成员函数中使用cin >>吗?

  17. 17

    我们可以使用类作为标题吗

  18. 18

    SOLR日光浴室我们可以使用带有maxmax查询的过滤查询吗?

  19. 19

    我们可以使用list.map调用具有多个参数的方法吗?

  20. 20

    使用检测习惯用法确定类型是否具有带有特定签名的构造函数

  21. 21

    使用检测习惯用法确定类型是否具有带有特定签名的构造函数

  22. 22

    我们可以获取扩展特定类的所有类吗

  23. 23

    使用概念或SFINAE检查类是否具有带有std :: array参数的模板化成员函数

  24. 24

    我们可以在python程序中多次使用带有某些参数的用户定义函数吗?

  25. 25

    我们可以用具有扩展方法的接口替换抽象类吗?

  26. 26

    我们可以配置具有多个DAO的服务类吗?

  27. 27

    我们可以用具有扩展方法的接口替换抽象类吗?

  28. 28

    我们可以在Android中加载带有某些特定文本的Autocomplete TextView吗?

  29. 29

    您可以使用函数生成具有唯一成员的类的实例吗?

热门标签

归档