代码之家  ›  专栏  ›  技术社区  ›  Adam

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

  •  0
  • Adam  · 技术社区  · 6 年前

    今天我试着做了一件让我惊讶的事情,但却发现没用。我有一个将类型和值作为参数的模板。我想专门化类型参数,但保持值参数打开。就像这样

    template <class T = void, bool Enabled = false>
    struct seFoo {};
    
    template <bool Enabled>
    struct seFoo<int, Enabled> {};
    
    // Doesn't work :(
    seFoo<false> foo;
    

    但是,这会导致模板参数太少的编译错误。似乎在编译器查看部分专用化之前,实例化必须与未指定模板的签名匹配。

    有没有办法让这个工作?

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

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

    0 回复  |  直到 6 年前
        1
  •  1
  •   aschepler    6 年前

    不,你不能真的这么做。

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

    在某些情况下,您可以使用默认模板参数、为模板参数定义自己的含义或其他此类技巧来执行某些操作。但是没有办法让一个模板以类型或值作为其第一个模板参数,并且不能在同一范围内有两个同名的类模板或别名模板。