gpt4 book ai didi

c++ - 模板参数包如何具有其他尾随参数?

转载 作者:太空狗 更新时间:2023-10-29 21:10:56 26 4
gpt4 key购买 nike

在 C++14 标准草案中,[temp.param]/11说:

If a template-parameter of a primary class template or alias template is a template parameter pack, it shall be the last template-parameter.

如果您尝试编译以下模板,编译器会报错。

template< typename ...Args, void(*f)(Args...) > // ERROR
struct Bar
{};

但是在这种情况下它是如何工作的呢?

template< typename F, F >
struct Bar;

template< typename ...Args, void(*f)(Args...) > // OK ???
struct Bar< void(*)(Args...), f >
{};

我可以看出它与它作为特化类(class)模板的一部分有关,但为什么

该规则明确指出它适用于主要 类模板。这是否意味着特化规则会发生变化?

我试图在标准中搜索这个,但找不到任何东西。你能对此有所启发吗?

最佳答案

The rule clearly states that it applies to a primary class template. Does this mean that the rules change for specializations?

是的。很简单,因为特化不是主要的类模板。因此,如果该措辞旨在适用于所有 模板声明,它会这么说。相反,该规则非常旨在仅适用于主要类模板(......和别名模板,不能专门化)。特化没有这样的限制。

这从根本上说是因为不可能在主模板中的模板参数包之后提供任何模板参数,但在特化中绝对可以这样做。例如,这是连接两个 tuple 特化的一种方法:

template <typename T, typename U>
struct tuple_concat;

template <typename... Ts, typename... Us> // <== parameter pack *after* parameter pack
struct tuple_concat<tuple<Ts...>, tuple<Us...>> {
using type = tuple<Ts..., Us...>;
};

这很好,很管用,很有用。但是能够在主类/变量/别名模板中编写这样的东西没有任何好处 - 因此为简单起见禁止这样做。


与所有 C++ 事物一样,当然有一个脚注。您本可以提供用于触发替换失败的尾随默认模板参数。但是还有其他方法可以解决这个问题,然后我们很快就会有概念。

关于c++ - 模板参数包如何具有其他尾随参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52175224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com