使用 SFINAE 检测成员函数 [重复]

2024-04-07

C++11中,判断一个类是否有成员函数size,您可以定义以下测试助手:

template <typename T>
struct has_size_fn
{
    typedef char (& yes)[1];
    typedef char (& no)[2];

    template <typename C> static yes check(decltype(&C::size));
    template <typename> static no check(...);

    static bool const value = sizeof(check<T>(0)) == sizeof(yes);
};

在 C++98 中是否有类似的技巧,可以在不依赖编译器扩展的情况下执行此操作,例如typeof?


事实上,你的检测可能是错误的。

问题是你所检测到的只是C有一个会员size:

  • 它可能是一个属性
  • 它可以是具有任何签名的方法
  • 甚至可能有多种方法(具有不同的签名)

如果您希望加强检测,您应该尝试仅检测right size(无论什么权利)。这是这样一个强化的检测 http://ideone.com/JKo8p5.

template <typename T>
class has_size {
private:
  typedef char Yes;
  typedef Yes No[2];

  template <typename U, U> struct really_has;

  template <typename C> static Yes& Test(really_has <size_t (C::*)() const,
                                        &C::size>*);

  // EDIT: and you can detect one of several overloads... by overloading :)
  template <typename C> static Yes& Test(really_has <size_t (C::*)(),
                                        &C::size>*);

  template <typename> static No& Test(...);

public:
    static bool const value = sizeof(Test<T>(0)) == sizeof(Yes);
};

Edit: 有过载 http://ideone.com/RGeZTX.

处理不正确的技巧size成员是really_has结构。但我并不假装它是完美的......

在 C++11 中,事情变得更简单 http://ideone.com/AmaBrN(尽管同样冗长)因为你可以通过以下方式检测事物use直接地。因此,等效的特征是:

template <typename T>
class has_size {
private:
  typedef char Yes;
  typedef Yes No[2];

  template<typename C> static auto Test(void*)
    -> decltype(size_t{std::declval<C const>().size()}, Yes{});

  template<typename> static No& Test(...);

public:
    static bool const value = sizeof(Test<T>(0)) == sizeof(Yes);
};

然而,C++ 中推荐的方法是不使用特征如果可以的话;例如在函数中你可以使用decltype就在类型签名中。

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

使用 SFINAE 检测成员函数 [重复] 的相关文章

  • 将 new 与 decltype 一起使用

    T t T is an implementation detail t new T want to avoid naming T to allow for flexibility t new decltype t error cannot
  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • 在现代 C++ 中,临时生命周期延长何时有用?

    在 C 中 您可以将函数的返回值 返回值 而不是引用 绑定到 const 引用 并且代码仍然有效 因为该临时对象的生命周期将延长到作用域末尾 例如 std string get string return abc void f const
  • 解析 JWT 令牌以仅获取有效负载内容,无需 C# 或 Blazor 中的外部库

    我正在使用 Blazor 编写可以访问 JWT 的客户端应用程序 我想知道一种简单的方法来读取令牌有效负载内容而不添加额外的依赖项 因为我不需要其他信息 也不需要验证令牌 我认为解析有效负载内容应该足够简单 只需将其写入方法即可 JwtTo
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • 从模板切换传递的类型

    在 C 中是否可以检查传递给模板函数的类型 例如 template
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 为什么'enable_if'不能用于禁用这里声明

    include
  • 将表(行)与 OpenXML SDK 2.5 保持在一起

    我想在 Word 文档中生成多个表 每行 2 行 但我想将这两行保留在一起 如果可能的话 new KeepNext 第一行不起作用 new KeepNext 第一行的最后一段不起作用 new CantSplit 放在桌子上不起作用 在所有情
  • 增强精神、递归和堆栈溢出

    为什么下面的代码在运行时崩溃 它会给出堆栈溢出错误 include
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • C#6 中的长字符串插值行

    我发现 虽然字符串插值在应用于现有代码库的字符串 Format 调用时非常好 但考虑到通常首选的列限制 字符串对于单行来说很快就会变得太长 特别是当被插值的表达式很复杂时 使用格式字符串 您将获得一个可以拆分为多行的变量列表 var str
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • C++ 中 void(*)() 和 void(&)() 之间的区别[重复]

    这个问题在这里已经有答案了 在此示例代码中 func1是类型void int double and funky是类型void int double include
  • 使用 using 声明时,非限定名称查找如何工作?

    根据 C 标准 这是格式错误还是格式良好 namespace M struct i namespace N static int i 1 using M i using N i int main sizeof i Clang 拒绝它 GCC
  • 来自 3rd 方库的链接器错误 LNK2019

    我正在将旧的 vc 6 0 应用程序移植到 vs2005 我收到以下链接器错误 我花了几天时间试图找到解决方案 错误LNK2019 无法解析的外部符号 imp 创建AwnService 52 在函数 public int thiscall

随机推荐

  • WPF ToggleButton 不正确的呈现行为

    这是怎么回事 如何解决 按我的切换按钮 现在看起来就像立即按下 选中 同时 MyToggleButton Checked 处理程序禁用 MyToggleButton 现在按非切换按钮 启用 我们看到什么 MyToggleButton 看起来
  • 对于具有默认分配器的标准容器,std::container::size_type 是否保证为 size_t?

    Like std string
  • TFS2018 是否仍支持 ISubscriber?

    截至 TFS 2017 Plugins 文件夹中有一个名为 Microsoft TeamFoundation Framework Server 的库 它包含 ISubscriber 接口 可以覆盖该接口以附加挂钩并添加事件行为 例如构建完成
  • Laravel 用户登录时如何设置会话变量

    发票应用程序开发正在使用 Laravel 进行 我为每个用户存储日期和金额格式settings table 当用户登录自己的帐户时如何设置Session多变的 请提出任何建议 我正在使用 Laravel 5 3 当然 文档告诉我们如何存储会
  • 未使用参数 ngrams

    我使用 Quanteda 进行文本分析 我使用这个命令 corp df2 lt tokens df text remove punct TRUE remove numbers TRUE remove symbols TRUE gt toke
  • XCode 4.4 iOS 5.1 模拟器问题

    我将我的 mac book 更新为 mountain lion 并将 Xcode 更新为 4 4 版本 在之前的版本中 我关闭 iOS 模拟器没有任何问题 并且 Xcode 自动停止构建过程 但现在如果我关闭 iOS 模拟器 Xcode 中
  • Scala:SeqT monad 转换器?

    如果我们有这样的两个函数 def findUserById id Long Future Option User def findAddressByUser user User Future Option Address 然后我们就可以使用
  • “关闭”某物是什么意思?

    我试图理解闭包 但从字面上看every我能找到的闭包定义使用了相同的神秘而模糊的短语 结束 什么是closure 哦 这是一个函数结束另一个功能 但我找不到 结束 的定义 有人能解释一下 A 事物 关闭 B 事物意味着什么吗 闭包是由代码指
  • 如何获取ECS集群的所有日志

    是否有一些 AWS 命令 get 可以从 ECS 集群的所有服务 任务中获取日志 就像是 aws ecs logs cluster dev or aws ecs describe clusters cluster dev logs 例如 必
  • 每周运行一次 php 脚本

    每个星期一我都需要清空 MYSQL 数据库的几个字段 首先 我考虑使用 cron 作业 但我的 Web 托管提供商 fatcow com 既不支持 SSH 也不支持通过命令行访问共享服务器 我还考虑过检查 date 以查看是否是星期一并执行
  • 从不规则时间序列创建规则 15 分钟时间序列

    我的 csv 文件中有一个不规则的时间序列 包含 DateTime 和 RainfallValue C SampleData csv DateTime RainInches 1 6 2000 11 59 0 1 6 2000 23 59 0
  • 树 /f cmd 修改日期。 Windows Powershell

    我需要创建一个 tree驱动器的文件夹 子文件夹和修改日期的列表 tree f命令效果很好 但我需要添加修改日期 我怎样才能做到这一点 它不会那么漂亮 但你可以使用 Recurse使用 Get ChildItem 选项来查找所有这些 此外
  • 是否可以使用 python-shell 包在 Node JS 中安装 python 包?

    我刚刚知道我们可以使用下面的 npm 包在 Node JS 中运行 Python 脚本 蟒蛇外壳 https www npmjs com package python shell 是否可以使用相同的库安装 python 包 就像是pip i
  • 自定义组件上的 OverlayTrigger 不起作用

    我试图在自定义组件 按钮 悬停时显示弹出窗口 class MyComponent extends React PureComponent
  • 如何避免页脚上的手风琴重叠

    我是 jQuery 新手 我正在使用手风琴 当我单击手风琴时 它会重叠在页脚上 我怎样才能避免它 下面是页脚的代码
  • 使用 mmap 访问 PCI-e 内存空间

    我在 Freescale MPC8308 处理器 基于 PowerPC 架构 上使用 PCI e 端口 在尝试使用它时遇到一些问题 端点 PCI e 设备的内存空间等于 256 MB 我可以使用 pciutils 包轻松读取和写入端点设备的
  • wxhaskell异步更新

    我正在使用 WxHaskell 以图形方式显示使用 TCP 通告状态更新的程序的状态 我使用 Data Binary 对其进行解码 当收到更新时 我想更新显示 所以我希望 GUI 能够异步更新其显示 我知道processExecAsync异
  • 如何强制在 DateTimeAxis 上显示特定日期

    是否可以强制在图表上显示网格线以及极端数据点的日期 我已经尝试了以下 Chart DateTimeAxis 属性的几乎所有配置 IntervalType Interval Minimum and Maximum但我对结果并不满意 设置属性M
  • B 树、数据库、顺序插入与随机插入以及速度。随机就是胜利

    EDIT Remus 纠正了我的测试模式 您可以在下面看到他的答案的更正版本 我采纳了用 DECIMAL 29 0 替换 INT 的建议 结果是 十进制 2133GUID 1836 即使行稍大一些 随机插入仍然获胜 尽管有解释表明随机插入比
  • 使用 SFINAE 检测成员函数 [重复]

    这个问题在这里已经有答案了 C 11中 判断一个类是否有成员函数size 您可以定义以下测试助手 template