对于枚举来说,替换失败不是错误 (SFINAE)

2023-12-09

有没有办法对枚举使用替换失败不是错误(SFINAE)?

template <typename T>
struct Traits
{
}
template <>
struct Traits<A>
{
};
template <>
struct Traits<B>
{
  enum
  {
     iOption = 1
  };
};

template <T>
void Do()
{
  // use Traits<T>::iOption
};

Then, Do<B>();作品和Do<A>();失败。但是,当 iOption 不存在时,我可以提供默认行为。 所以我把Do的一部分分离出来给DoOption。

template <typename T, bool bOptionExist>
void DoOption()
{
  // can't use Traits<T>::iOption. do some default behavior 
};
template <typename T>
void DoOption<T, true>()
{ 
  // use Traits<T>::iOption
};
template <T>
void Do()
{
  // 'Do' does not use Traits<T>::iOption. Such codes are delegated to DoOption.
  DoOption<T, DoesOptionExist<T> >();
};

现在,缺失的部分是DoesOptionExist<T>- 检查结构中是否存在 iOption 的方法。 当然 SFINAE 适用于函数名称或函数签名,但不确定 它适用于枚举值。


如果您可以使用 C++11,这完全是微不足道的:

template<class T>
struct has_nested_option{
  typedef char yes;
  typedef yes (&no)[2];

  template<class U>
  static yes test(decltype(U::option)*);
  template<class U>
  static no  test(...);

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

C++03 版本(令人惊讶地)相似:

template<class T>
struct has_nested_option{
  typedef char yes;
  typedef yes (&no)[2];

  template<int>
  struct test2;

  template<class U>
  static yes test(test2<U::option>*);
  template<class U>
  static no  test(...);

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

Usage:

struct foo{
  enum { option = 1 };
};

struct bar{};

#include <type_traits>

template<class T>
typename std::enable_if<
  has_nested_option<T>::value
>::type Do(){
}

int main(){
  Do<foo>();
  Do<bar>(); // error here, since you provided no other viable overload
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于枚举来说,替换失败不是错误 (SFINAE) 的相关文章

随机推荐

  • R保存和加载数据帧

    我使用此命令保存了数据框 保存 国家数据 文件 数据 Rda 并使用此命令加载它 负载 数据 Rda 但我没有看到包含我创建的数据的表 保存单个 data framesave可能会令人困惑 因为load将 data frame 以及文件中的
  • ImageView.getMatrix() 和 ImageView.getImageMatrix() 有什么区别?

    我在不同的论坛上看到过这个问题 但没有人给出答案 getMatrix 是否处理视图中的图像位置 而 getImageMatrix 处理图像相对于自身的大小 Edit 以下是文档所说的 矩阵 getImageMatrix 返回视图的可选矩阵
  • Haskell Collection API 的“Unfoldable”类型类中函数依赖的作用

    我试图理解 Haskell 的设计Data Collection库 来自 Scala 背景 It uses 功能依赖 其中有一个Scala 模拟 但它们的使用方式对我来说没有意义 在里面Unfoldable类 复制如下 元素类型i显示为取决
  • 可以使用 Hibernate 注释定义 INITIALLY DEFERRED 约束吗?

    我有一个表 其中有一列具有唯一约束 我希望将约束检查推迟到提交时间 如果我像这样使用 Postgres SQL 创建它 省略许多列 CREATE TABLE instrument id bigint NOT NULL name charac
  • 在 MySQL 中替换

    在我的数据库中 我有一些这样的记录 有两列 Id Name 11 Meal 997 12 Meal 998 13 Meal 999 14 Meam 000 15 Meam 001 16 Meam 002 但这是应用程序中的一个问题 由于逻辑
  • 使用jsPDf将网页导出为PDF

    当用户单击按钮时 我尝试将网页导出为 pdf 文件 但下面的代码对我不起作用 任何人都可以帮助我 我哪里出错了 我正在使用 jsPDF 将网页导出为 pdf
  • Google Maps API v3 - 多次地理编码器请求后的 fitBounds

    我想要做的是使用 AJAX 和 JSON 加载一堆地址 找出每个地址的纬度和经度 在地图上放置标记 然后使用fitBounds 放大以便所有标记都可见 听起来很简单 我已经把大部分都打包好了 但我的问题是fitBounds part 基本上
  • xsd 唯一约束不起作用

    我有一个根 Inserts 标签 一系列 Inserts 标签 每个标签都有一个 name 属性 我无法让在线验证器发现存在重复的 名称 值 我们已经挣扎了 好几天了 感谢您发现 XSD
  • 如何在 SQL Server 中合并时间间隔

    假设我有以下事件表personId startDate and endDate 我想知道 X 花了多少时间做一个事件 事件可以相互覆盖 如果此人只有 1 个事件 则很简单 datediff dd startDate endDate 如果这个
  • 关闭delphi firemonkey移动应用程序(Android)中的模式对话框

    我正在花花时间试图弄清楚为什么我的模态表单不会关闭 使用 Delphi XE 5 和 FireMonkey 移动应用程序 Android 我遵循了信息 FireMonkey 移动应用程序中的显示模式对话框 出于演示目的 我创建了一个新的 F
  • Expo SDK需要Expo才能运行

    我正在世博会上运行我的项目 运行 expo pop 后 出现以下错误 Expo SDK需要Expo才能运行 即使对于一个全新的项目 我也会收到此错误 并且我无法再对世博会做任何事情 我跑 expo init Project1 然后进入项目目
  • Android:以编程方式获取硬件信息

    我需要获取运行我的应用程序的 Android 设备上的硬件相关信息 我需要以下类型的信息 CPU 制造商 型号和序列号 SD 卡制造商和序列号 相机制造商和其他相关规格 蓝牙相关硬件信息 WiFi相关硬件信息 RAM 供应商 型号 显示器供
  • 实体框架中唯一字段的选项 - dbSet 的导航属性?

    经过大量研究 实体框架 4 4 似乎不支持唯一约束 是的 它可以并且应该在数据库中完成 但我更希望它发生在模型验证中 因此对用户的警告更漂亮 对于程序员来说 能够用 Unique 属性来装饰属性是理想的 并且应该以某种方式是可能的 例如 p
  • 内存损坏

    我正在运行一个小C程序 include
  • Opencart 为 opencart 添加产品选项

    除了产品选项外 我的购物车似乎正常运行 当我单击 添加购物车 按钮时 会添加该项目 但不会添加任何选项 我真的不明白为什么会发生这种情况 因为我已经按照函数的要求将选项作为数组提交了 使用option id and option value
  • XSL 输出方法文本在 xsl 中包含空格

    我正在创建一些 xsl 将我的 xml 转换为文本 最终将是 csv 我用的是VS2008 当我使用编辑器创建 xsl 时 转换后的输出将按照我的 xsl 缩进 但是 如果我编辑 xsl 并删除格式化的空格 它会正确输出 但这样做是一场噩梦
  • PostgreSQL 多值更新插入

    是否可以在 PostgreSQL 中执行多值更新插入 我知道存在多值插入 就像 ON CONFLICT 关键字在密钥被违反时执行更新一样 但是是否有可能将两者结合在一起 像这样的事情 INSERT INTO table1 col1 col2
  • 多个 setState 不会累积到一次更新/渲染中...?

    我记得当我发现这一点时我是多么惊讶setState是异步的 现在我偶然发现了一种 奇怪 的行为 它不符合我的理解setState异步性 考虑下面的一个片段 由于某种原因它会导致Script Error 这是外部沙箱 https codesa
  • Flutter - 在 Firebase 中注册后删除自动登录

    我在 Flutter 中注册时遇到问题 据我所知 firebase 在注册后自动登录用户 我想阻止此操作 因为在我的应用程序中 每个用户都必须得到确认 我在其他主题中看到了这种情况的解决方案 但在我看来 注册后调用注销并不是一个好主意 因为
  • 对于枚举来说,替换失败不是错误 (SFINAE)

    有没有办法对枚举使用替换失败不是错误 SFINAE template