如何使参数推导适用于使用基类构造函数的派生类?

2023-11-22

当派生类使用基类构造函数时,推论似乎总是fail。然而,当基类有很多构造函数时,重新定义所有构造函数是非常笨拙的。当基类快速演变为新的构造函数时,这也是一个痛苦。老问题是两年多前提出的,所以我想知道:在 2020 年 c++17 和 c++2a 可用时,是否有任何解决办法?

template<typename ...As>
class base_t
{
public:
    base_t(As... args){}
};

template<typename ...As>
class A_t: public base_t<As...>
{
public:
    A_t(As... args): base_t<As...>{args...} {};
};

template<typename ...As>
class B_t: public base_t<As...>
{
    using base_t<As...>::base_t;
};

int main()
{
    base_t a{1, 2.0f};
    A_t{1, 2.0f};
    B_t{1, 2.0f}; //fails unless explicitly specialize the template
    return 0;
}

根据@Sam 和@Barry 更新:

推导指南非常有帮助。然而,对于稍微复杂一点的情况,它仍然会失控:

template <typename A>
struct D_t {
    A x;
    D_t(A x) :x{x} {}
};
template<typename A, typename B>
class base2_t
{
public:
    base2_t(A a, B b){std::cout << "1\n";}
    base2_t(A a, D_t<B> c, int x){std::cout << "2\n";}
    base2_t(A a, B b, int x){std::cout << "3\n";}
    base2_t(A a, B b, int x, float y){std::cout << "4\n";}
    explicit base2_t(A(*fp)(B)){std::cout << "5\n";}
    // if we have lots of similar things like above
    // we will quickly end up write lots of different
    // guides.
};
template<typename A, typename B>
class C_t: public base2_t<A, B>
{
    using base2_t<A, B>::base2_t;
};
template<typename A, typename B, typename ...As>
C_t(A, B, As...)->C_t<A, B>;
template<typename A, typename B>
C_t(A(*)(B))->C_t<A, B>;
float func1(int x)
{
    return x;
}
int main()
{
    C_t{1, 2.0f, 3};
    base2_t{1, D_t{2.0f}, 3};
    C_t{1, D_t{2.0f}, 3}; // this is wrong, we have to deal with it by checking types and write different guides.
    base2_t{&func1};
    C_t{&func1};
}

到 2023 年,proposal被接受于c++23 P2582R1但两者都没有gcc nor llvm已经实施了。但希望在今年年中这个问题最终能得到解决。


能够从基类继承推导指南是proposed对于c++20。然而,这个功能并没有出现,正如最后一行所说:

来自继承构造函数的 CTAD 措辞尚未及时在 C++20 委员会草案中最终确定,并将在稍后的时间点在单独的措辞论文中发布。

因此,到目前为止,您将需要显式地为派生类提供推导指南(或者像您那样定义构造函数)A_t)。希望这将在 c++23 中得到修复。

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

如何使参数推导适用于使用基类构造函数的派生类? 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • 在 Windows 8 中的 WinRT 上动态执行代码(C++ 或 .NET/C#)?

    Windows 8 Metro 下的 WinRT 是否允许动态加载和执行代码 例如 是否可以将 dll 下载到内存或隔离存储并从中运行代码 JIT 将脚本语言编译为本机汇编语言 例如第三方浏览器 的代码是否能够在 WinRT 中执行相同的操
  • 媒体播放器在线播放 MP3 文件

    我有一个 Android 应用程序 可以流式传输 MP3 文件并在播放器中播放该文件 但问题是mediaPlayer prepare 需要很长时间缓冲并且应用程序冻结 所以我尝试使用prepareAsync 但是使用这个功能我无法让播放器播
  • 通过 eclipse 运行 JUnit 测试时的 Maven Surefire 参数

    关于 Maven 的新手问题 Surefire Eclipse JUnit 我已经在项目的 pom 文件中配置了 maven surefire plugin 以传递一些额外的 JVM 参数 如下所示
  • 如何应用 git format-patch 生成的补丁?

    我有两个本地 git 存储库 都指向same远程存储库 在一个 git 存储库中 如果我这样做git format patch 1 如何将该补丁应用到其他存储库 注意 您可以先预览您的补丁将执行的操作 首先是统计数据 git apply s
  • 如何在Android应用程序中隐藏导航栏?

    我想知道如何在 Android 应用程序中隐藏导航栏 我一开始知道如何隐藏它 但是一旦我触摸屏幕 它就会弹出 我想隐藏它 就像 部落冲突 等游戏隐藏它一样 使其弹出的唯一方法是向下滑动通知或滑动导航栏应该在的位置 使用沉浸式模式检查这个沉浸
  • 在 WPF 中使用图像和图标

    我试图在 WPF 应用程序中使用图标 并使用一些图像来处理其他事情 但我不断从设计器视图中收到错误 提示诸如 path x 不是有效资源或无法找到 之类的内容 其中 path x 是我尝试使用的任何图像的路径 如果它在正确的地方寻找 我打赌
  • 视图未附加到窗口管理器崩溃

    我正在使用 ACRA 来报告应用程序崩溃 我正在得到一个View not attached to window manager错误消息并认为我已经通过包装来修复它pDialog dismiss 在 if 语句中 if pDialog nul
  • Python - 连接多个线程并设置超时

    我有多个进程线程正在运行 我想加入all它们与超时参数一起 我知道如果不需要超时 我可以写 for thread in threads thread join 我想到的一个解决方案是使用一个主线程将所有线程连接在一起并尝试连接该线程 但是
  • Linux内核.mod.c文件中版本信息的含义

    在所有可加载内核模块中 当make给出它会生成一个名为的文件modulename mod c此外modulename ko 以下代码摘录自 mod c文件 其中包含一个 number function 一对 这个数字有什么意义呢 这个数字是
  • AC账户存储错误5

    当尝试将帐户保存到 ACAccountStore 时 我有时会收到此错误 稍后 如果我尝试访问该帐户 我发现它实际上已被保存 到目前为止 我还没有找到有关这个不起眼的错误的任何信息 有谁知道这意味着什么 错误域 com apple acco
  • Azure - 通知中心命名空间错误

    Im trying to set up push notifications with Azure at the moment but every time i go and try to set up a notification hub
  • 抑制 JSP 文件中的 Java 未检查警告

    我有一个旧版 Web 应用程序 它使用 jstl 和 Struts 1 标签 当我使用 Java 5 6 预编译 JSP 文件时 jstl 和 Struts 1 标记会抛出有关 未经检查或不安全操作 的警告 例如 如果我使用以下标签 抛出以
  • Python MysqlDB 使用cursor.rowcount 和 SSDictCursor 返回错误的计数

    我有以下代码 cur db cursor cursors SSDictCursor cur execute SELECT FROM large table result count cur rowcount print result cou
  • CSS:如何使水平列表居中?显示:内嵌不工作

    我在让最简单的代码工作时遇到了很大的困难 我希望我的 css 水平列表居中 仅此而已 链接在这里 http bit ly LtIBai 我有这个代码 megaMenu megaMenuHorizontal ul megaMenu text
  • OS X / Linux:通过管道连接到两个进程?

    我知道关于 program1 program2 and program1 tee outputfile program2 但是有没有办法将程序的输出同时输入到程序和程序 3 中呢 你可以这样做tee和流程替代 program1 tee gt
  • PSQLException:此 ResultSet 已关闭

    我一生中第一次出现这种奇怪的错误 我不知道这意味着什么 我有一个类 它从 postgresql 数据库上的表中检索信息 执行一些操作并返回带有解析元素的数组列表 ResultSet rs ProduttoreDCS getProduttor
  • 选择中的 LINQ 选择

    我正在尝试查询包含以下内容的集合Employee信息 当我查询该集合时 我想返回对象的枚举 其中每个对象都有两个字段 Name 经理姓名 请注意 每个经理也是员工 现在 这是我遇到的问题 当我做一个select在一个select 的值Man
  • f.seek() 和 f.tell() 读取文本文件的每一行

    我想打开一个文件并使用读取每一行f seek and f tell 测试 txt abc def ghi jkl 我的代码是 f open test txt r last pos f tell get to know the current
  • Outlook 回复或回复全部电子邮件

    Set objOutlook CreateObject Outlook Application Set objMail objOutlook CreateItem 0 objMail To email protected objMail c
  • 如何使参数推导适用于使用基类构造函数的派生类?

    当派生类使用基类构造函数时 推论似乎总是fail 然而 当基类有很多构造函数时 重新定义所有构造函数是非常笨拙的 当基类快速演变为新的构造函数时 这也是一个痛苦 老问题是两年多前提出的 所以我想知道 在 2020 年 c 17 和 c 2a