Search code examples
c++templatesgeneric-programmingnon-type

What's the point of unnamed non-type template parameters?


According to the reference, the name of a non-type template parameter is optional, even when assigning a default value (see (1) and (2)). Therefore these template structs are valid:

template <int> struct Foo {};
template <unsigned long = 42> struct Bar {};

I haven't seen a possibility of accessing the values of the non-type parameters. My question is: What's the point of unnamed/anonymous non-type template parameters? Why are the names optional?


Solution

  • First, we can split declaration from definition. So name in declaration is not really helpful. and name might be used in definition

    template <int> struct Foo;
    template <unsigned long = 42> struct Bar;
    
    template <int N> struct Foo {/*..*/};
    template <unsigned long N> struct Bar {/*..*/};
    

    Specialization is a special case of definition.

    Then name can be unused, so we might omit it:

    template <std::size_t, typename T>
    using always_t = T;
    
    template <std::size_t ... Is, typename T>
    struct MyArray<std::index_sequence<Is...>, T>
    {
        MyArray(always_t<Is, const T&>... v) : /*..*/
    };
    

    or used for SFINAE

    template <typename T, std::size_t = T::size()>
    struct some_sized_type;