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

后端 未结 3 942
面向向阳花
面向向阳花 2020-12-19 13:28

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 ar

相关标签:
3条回答
  • 2020-12-19 14:06

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

    I can think of specialization:

    template<int = 42>
    struct Foo{
       char x;
    };
    
    template<>
    struct Foo<0> {
       int x;
    };
    
    template<>
    struct Foo<1> {
       long x;
    };
    

    Then:

    Foo<0> a; // x data member is int
    Foo<1> b; // x data member is long
    Foo<7> c; // x data member is char
    Foo<>  d; // x data member is char
    
    0 讨论(0)
  • 2020-12-19 14:08

    Oh, you can access them!

    template <int> struct Foo {};
    
    template <int N>
    int get(Foo<N>) {
        return N;
    }
    
    int main() {
        Foo<3> foo;
        return get(foo);
    }
    

    This might be a bit contrived. But in general for some templates you don't want to name them and then it is convenient that you don't have to.

    0 讨论(0)
  • 2020-12-19 14:11

    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;
    
    0 讨论(0)
提交回复
热议问题