c++ - 类模板推导可以在模板中间启用参数包吗?
问题描述
首先,我想说我知道以下在 C++17 中是不可能的,我更感兴趣的是它是否可能。
函数模板和类模板的不同之处在于第一个声明是可能的,而第二个则不是:
template<class ...Ts, class S>
void foo(S s);
template<class ...Ts, class S>
class bar;
在这个问题的公认答案中指出,这是因为编译器可以S
从函数参数中推断出,而它不能为类做到这一点。因此,对于第一个代码,它可以区分Ts
andS
并且它不能用于第二个代码。
虽然我仍然有点不确定,为什么编译器不能通过S
使用最后一个模板参数进行推断,但我明白为什么函数 case 明显优越。
但以下确实编译
template<class ...Ts, class S>
void foo();
只有一个人不能以任何方式调用它,因为编译器将无法推断S
. 所以从理论上讲,是否可以允许声明bar
编译并将错误外包给我们想要使用它的任何时候?那么如果我们没有默认构造函数和一个像
bar::bar(S s, Ts... ts); // Edit: Added Ts which are necessary as @Nicol Bolas. And I am aware that it is weird to turn them around here but not in the template.
我们可以由此推断S
,每当我们初始化一个类型的对象时bar
(除了复制/移动,但随后只采用与传入的对象相同的类型)。
那么为什么这是不可能的呢?是因为它bar
是一种类型,并且应该能够在不实例化该类型的对象的情况下使用它吗?
解决方案
推荐阅读
- scala - 从 Akka-2.6.9 更新到 Akka 2.6.10 时 ShardCoordinator$LeastShardAllocationStrategy 中的 NullPointerException
- entity-framework - 为什么这个模型不更新?
- python - 如何在随机游走中使用 imshow 和 colorbar 函数?
- directwrite - DirectWrite 用多种颜色绘制连字?
- node.js - 返回空对象但无法执行 !posts if 语句以在 express 应用程序中使用 mongoose 引发错误
- javascript - 未应用 addEventListener
- mplfinance - 更改 mplfinance 中的支撑线和阻力线颜色
- django - 具有角色和权限的 SSO
- python - 将整数的隐蔽列表转换为字符串
- node.js - 无法在 Npm install 上读取 null 的属性“发射”