可变参数构造函数中的 SFINAE

2024-05-20

我想定义一个通用的强别名类型,即一个类型

template<typename T, auto ID = 0>
class StrongAlias {
    T value;
};

这样对于一个类型T a StrongAlias<T>可以以完全相同的方式使用T, but StrongAlias<T, 0> and StrongAlias<T, 1>是不同的类型,不能相互隐式转换。 为了模仿一个T尽可能完美,我希望我的StrongAlias具有相同的构造函数T。 这意味着我想做类似以下的事情:

template<typename T, auto ID = 0>
class StrongAlias {
    T value;
public:
    // doesn't work
    template<typename... Args, typename = std::enable_if_t<std::is_constructible_v<T, Args...>>>
    StrongAlias(Args&&... args) noexcept(std::is_nothrow_constructible_v<T, Args...>)
        : value(std::forward<Args>(args)...) {}
};

除了这行不通,因为template parameter pack must be the last template parameter,正如 clang 5.0 会告诉我的那样。 我想到的使用 SFINAE 的另一种方法是返回类型,但由于构造函数没有返回类型,因此这似乎也不起作用。

有没有办法在构造函数中的可变模板参数包上使用 SFINAE?

或者,如果没有,我可以用另一种方式完成我想要的事情吗?

请注意,可以从 a 隐式构造T就我而言还不够,例如StrongAlias<std::optional<int>>显示:如果StrongAlias只能从隐式构造std::optional<int>,它不能由std::nullopt(类型std::nullopt_t),因为这将涉及 2 个用户定义的转换。我真的想要拥有别名类型的所有构造函数。

编辑: 当然,可以在没有 SFINAE 的情况下实现这一点,并在以下情况下让程序无效:StrongAlias是由不兼容的参数构造的。然而,虽然在我的具体情况下这是可以接受的行为,但它显然不是最佳的,因为StrongAlias可以在模板中使用,该模板查询给定类型是否可以从某些参数构造(通过std::is_constructible)。虽然这会产生std::false_type for T,这会导致std::true_type for StrongAlias<T>,这可能意味着不必要的编译错误StrongAlias<T>那不会存在T.


只是改变std::enable_if_t到非类型模板参数:

template<typename T, auto ID = 0>
class StrongAlias {
    T value;
public:
    template<typename... Args, std::enable_if_t<std::is_constructible_v<T, Args...>, int> = 0>
    StrongAlias(Args&&... args) noexcept(noexcept(T(std::declval<Args>()...)))
        : value(std::forward<Args>(args)...) {}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可变参数构造函数中的 SFINAE 的相关文章

随机推荐

  • 我在 MacBook M1 max 中的 nodejs 连接到数据库 oracle 时遇到问题帮助我

    Node js 中的错误消息 nodemon 启动node server js错误 错误 DPI 1047 无法找到 64 位 Oracle 客户端库 dlopen Users pitidev ldb Downloads instantcl
  • 如何更换HXT中的节点?

    给定一个示例 xml 文件
  • Clang 3.2 构建在构建 gcc 4.7 后损坏

    所以我知道 Clang 大多数时候 依赖于 Gnu 的 libstdc 3 但是在构建 gcc 4 7 0 因为太棒了 之后 我似乎遇到了问题 clang 的所有路径都是错误的 我是否需要清理我的构建目录并从头开始使用 clang 特别是它
  • 使用 MonoDroid 试用版调试应用程序

    我已经安装了 MonoDroid 试用版 我创建了一个 Hello World 应用程序并在模拟器中对其进行调试 但任何应用程序都会出现在 Android 设备模拟器上的应用程序列表中 问题是试用版还是我的应用程序中出现了一些错误 你能帮我
  • 将值添加到数组的最有效方法

    假设我有一个大小为N where N gt 0 是否有一种更有效的方法可以不需要 O N 1 步骤来添加到数组中 在代码中 本质上 我目前正在做的是 function prependArray value oldArray var newA
  • Chocolatey 无法使用 PowerShell cmdlet

    所以 我开始使用巧克力了 但是 我注意到 cmdlet 不起作用 例如 如果尝试使用 choco 命令执行任何操作 前任 choco install vlc 它工作得很好 但是 如果我尝试使用旧的 cmdlet 前任 Install Pac
  • 从 MVC 中的 FormCollection 获取选定的下拉列表值

    我有一个使用 MVC 发布到操作的表单 我想从操作中的 FormCollection 中提取选定的下拉列表项 我该怎么做 我的 HTML 表单
  • PySpark - 系统找不到指定的路径

    Hy 我已经多次运行 Spark Spyder IDE 今天我收到这个错误 代码是相同的 from py4j java gateway import JavaGateway gateway JavaGateway os environ SP
  • mysql 如何将 varchar(10) 转换为 TIMESTAMP?

    我已将所有日期存储到数据库中varchar 10 现在我想将它们转换为 TIMESTAMP 当我运行sql时 ALTER TABLE demo3 CHANGE date date TIMESTAMP NOT NULL 它提醒 1292 In
  • 向信号处理程序提供/传递参数

    我可以向信号处理程序提供 传递任何参数吗 Signal handling struct sigaction act act sa handler signal handler some more settings 现在 处理程序看起来像这样
  • 检测匿名/隐身浏览

    Android 默认浏览器允许匿名浏览 是否可以检测用户何时在默认 Android 浏览器应用程序的隐身选项卡中浏览 我对用户访问的网址不感兴趣 我正在使用内容观察者对象来接收用户浏览历史记录的更新 当用户打开隐身选项卡时 我没有收到任何更
  • 将父容器扩展至 100% 高度以容纳浮动内容

    我正在为一个客户项目而苦苦挣扎 我的全部divs 没有绝对定位 height 100 for html body 和容器divs 但静态内容未达到其内容 在 910 像素处 我可以将溢出属性更改为auto 并且背景会继续向下到内容的末尾 但
  • Jekyll YAML 循环引用

    我有一个包含两个页面的 jekyll 项目 每个页面都由互相引用的 YAML 映射支持 例如 a a name Ay parents children b b b name Bee parents a children Vanilla YA
  • 旋转后平移

    我正在使用适用于 Android 的 OpenGL ES 2 0 我正在使用触摸屏平移和旋转模型 我的平移仅在 x y 平面内 并且我的旋转仅围绕 z 轴 想象一下 直接向下看桌子上的地图 移动到地图上的各个坐标 并且能够旋转地图在你正在看
  • IE 9 脚本错误 SCRIPT438:对象不支持属性或方法“addEventListener”

    我有一个可以在 Firefox 中使用的 jQuery 弹出窗口 但是 我在 html 页面的第 1 行收到以下错误消息 SCRIPT438 对象不支持属性或方法 addEventListener popup 1 html 第 1 行字符
  • |数据目录|在项目属性>设置中

    连接字符串设置如下 姓名 dbPerson连接字符串 类型 连接字符串 范围 应用 价值 数据源 数据目录 dbPerson sdf 当我安装并运行该应用程序时 它会在 C MyApp Data 文件夹中查找数据库 它应该是 C MyApp
  • iOS 11 安全区域布局指南向后兼容性

    启用安全区域布局指南是否与 iOS 11 以下版本兼容 我设法使用新的安全区域布局指南并保持与 iOS 9 和 iOS 10 的向后兼容性 编辑 正如 NickEntin 的评论所指出的 此实现将假定存在状态栏 但在 iPhone X 的横
  • 无法使用 Nest CLI 创建新项目

    我正在关注this https docs nestjs com first steps创建 Nest 项目的教程 我已经安装了Nest CLI使用这个命令 npm i g nestjs cli 我使用以下命令检查了本地安装的软件包列表 发现
  • 如何保留数组的重复项

    在 Javascript 中 我试图只将重复项保留在数组中 例如我的初始数组是 1 1 2 3 3 3 3 4 5 5 结果应该是 1 3 5 我尝试过使用 indexOf 和 inArray 但无法弄清楚 我知道如何删除重复项 但保留它们
  • 可变参数构造函数中的 SFINAE

    我想定义一个通用的强别名类型 即一个类型 template