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

C++中的新模板:默认匹配的模板模板

  •  1
  • thb  · 技术社区  · 5 年前

    C++ 17标准说可以做到这一点:

    template<class T, class U = T> class B { /* ... */ };
    template<template<class> class P> class X { /* ... */ };
    
    X<B> xb; // OK in C++17; ill formed in C++14
    

    C++ 14标准使同一代码出错。

    旧的C++ 14规则对我来说是有意义的。新的C++ 17规则没有。什么改变了?

    作为参考,上面的示例代码将出现

    • 在教派中。C++ 17标准的(3)(草案) here )
    • 在教派中。C++14标准(草案2或3)(草案) here )
    1 回复  |  直到 5 年前
        1
  •  3
  •   thb    5 年前

    为简洁起见,示例代码省略了详细信息。让我们扩展示例:

    template<class T, class U = T> class B { /* ... */ };
    template<template<class> class P> class X {
        P<int, int> pii; // error: P has been declared to take only one argument
        P<int>      pi;  // OK
        P<char>     pc;  // OK
        /* ... */
    };
    
    X<B> xb; // OK in C++17; ill formed in C++14
    

    最后一行解决 P<int> 作为 B<int> . 确实,最后的手段 B<int, int> ,但鉴于默认参数, B<INT> 是一个明确的方式来写。

    原则上,据我所知,C++14没有理由不能理解这一点,但是对于C++14来说,推理链太复杂了。三年后,C++17理解了这一点。

    顺便说一下,CLAN C++编译器提供了一个 -frelaxed-template-template-args 解决问题的选择。如果在clang上使用模板模板,则可以断言此选项。(@rakete1111因为引起了人们对clang选项的注意而被认可。)