在第一个参数上部分专门化模板

时间:2019-04-04 00:40:15

标签: c++ templates c++17 template-specialization

我今天尝试做某事,令我惊讶的是发现那没用。我有一个采用类型和值作为参数的模板。我想专门研究类型参数,但将值参数保持打开状态。像这样

template <class T = void, bool Enabled = false>
struct seFoo {};

template <bool Enabled>
struct seFoo<int, Enabled> {};

// Doesn't work :(
seFoo<false> foo;

但是,这会导致模板参数过少的编译错误。看来实例化必须与未专门模板的签名匹配,然后编译器甚至会考虑部分专门化。

是否有办法使它正常工作?

如果根本不可能采用这种方法,那么我对替代方法很感兴趣。

显然我不是唯一对此感到惊讶的人。 This article到最后都会犯同样的错误。

1 个答案:

答案 0 :(得分:1)

不,您不能真正做到这一点。

请注意,您不能以任何方式直接使用类模板的部分专业化功能。它的唯一功能是,当您尝试正常使用主模板时,如果部分专业化是模板参数的匹配项,并且是其他任何显式/部分专业化中的最佳匹配,则使用部分专业化代替主要模板,以生成该特定类类型的定义。

在某些情况下,您可以使用默认模板参数来做一些事情,为模板参数定义自己的含义,或者使用其他类似的技巧。但是,没有一种方法可以将类型或值作为其第一个模板参数,并且在同一个作用域中不能有两个具有相同名称的类模板或别名模板。