Partial template specialization with multiple template parameter packs

后端 未结 1 1386
南方客
南方客 2021-02-07 10:49

Continuing my journey into the world of variadic templates, I encountered another problem.

Assuming the following template class:

template < typename          


        
相关标签:
1条回答
  • 2021-02-07 11:14

    Probably this answer won't clear your question directly, but the following code compiled on ideone(gcc-4.5.1) when I tested.

    #include <cstdio>
    #include <tuple>
    
    template< class, class > struct S {
      S() { puts("primary"); }
    };
    
    template<
      template< class... > class T, class...TArgs
    , template< class... > class U, class...UArgs
    >
    struct S< T< TArgs... >, U< UArgs... > > {
      S() { puts("specialized"); }
    };
    
    int main()
    {
      S< int, int >  p;                                       // "primary"
      S< std::tuple< int, char >, std::tuple< float > >  s;   // "specialised"
    }
    

    I'm not sure this code is strictly conformant, but as far as I read N3225 14.5.3, I couldn't find the statement which mentions that template parameter pack has to be the last template parameter.

    Edit:
    I reread N3225 and found the following statements:

    8.3.5/4 If the parameter-declaration-clause terminates with an ellipsis or a function parameter pack (14.5.3), the number of arguments shall be equal to or greater than the number of parameters that do not have a default argument and are not function parameter packs.

    14.8.2.5/10 [Note: A function parameter pack can only occur at the end of a parameter-declarationlist(8.3.5). -end note]

    So, as you mentioned, function parameter pack has to be the last parameter unfortunately.
    A non-template member function of a class template is an ordinary function for that class when it is instantiated(fully specialized). So I wish that the code in this question can be compiled logically, as a special case.

    0 讨论(0)
提交回复
热议问题