Какой смысл в неназванных нетиповых параметрах шаблона? - PullRequest
2 голосов
/ 20 января 2020

В соответствии с ссылкой , имя параметра шаблона нетипичного типа является необязательным, даже при назначении значения по умолчанию (см. (1) и (2)). Поэтому эти шаблонные структуры действительны:

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

Я не видел возможности доступа к значениям нетиповых параметров. Мой вопрос: в чем смысл неназванных / анонимных нетиповых параметров шаблона? Почему имена не обязательны?

Ответы [ 3 ]

5 голосов
/ 20 января 2020

Какой смысл неназванные / анонимные нетипизированные параметры шаблона?

Я могу придумать специализацию:

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

template<>
struct Foo<0> {
   int x;
};

template<>
struct Foo<1> {
   long x;
};

Тогда :

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
4 голосов
/ 20 января 2020

Во-первых, мы можем отделить объявление от определения. Так что имя в декларации не очень полезно. и имя может использоваться в определении

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

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

Специализация - это особый случай определения.

Тогда имя можно не использовать, поэтому мы можем его опустить:

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) : /*..*/
};

или используется для SFINAE

template <typename T, std::size_t = T::size()>
struct some_sized_type;
2 голосов
/ 20 января 2020

О, вы можете получить к ним доступ!

template <int> struct Foo {};

template <int N>
int get(Foo<N>) {
    return N;
}

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

Это может быть немного надуманным. Но в целом для некоторых шаблонов вы не хотите называть их, и тогда удобно, что вам не нужно.

...