首页 > 解决方案 > 类模板推导可以在模板中间启用参数包吗?

问题描述

首先,我想说我知道以下在 C++17 中是不可能的,我更感兴趣的是它是否可能。

函数模板和类模板的不同之处在于第一个声明是可能的,而第二个则不是:

template<class ...Ts, class S>
void foo(S s);

template<class ...Ts, class S>
class bar;

这个问题的公认答案中指出,这是因为编译器可以S从函数参数中推断出,而它不能为类做到这一点。因此,对于第一个代码,它可以区分TsandS并且它不能用于第二个代码。

虽然我仍然有点不确定,为什么编译器不能通过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是一种类型,并且应该能够在不实例化该类型的对象的情况下使用它吗?

标签: c++templateslanguage-lawyervariadic-templates

解决方案


推荐阅读