2013-03-12 1 views
3

В стандарте C++ в главе 14 (Шаблоны) он ссылается на параметры шаблона с несколькими разными именами в зависимости от их контекста.template-parameter vs type-parameter vs non-type parameter

не-тип параметра

template<int N> 
class foo {}; 

параметр шаблона

template<typename T> 
class bar {}; 

типа Параметр

????? 

В эта цитата ниже, похоже, что это три разные вещи, однако я не могу понять, что такое type-parameter?

14.1 Параметры шаблона [temp.param]

9 ... Шаблон аргументов по умолчанию могут быть определены для любого вида-шаблона параметра (тип, не тип, шаблон) это не пакет параметров шаблона (14.5.3). ...

Здесь вы можете увидеть, что у него есть три разных имени для параметров шаблона. Если шаблон-параметр был обобщением двух других, то зачем включать это в список выше.

В разделе 14.1.2 тогда относится к ним, как только типа и нон-тип и шаблон-параметр как обобщение.

И что это? Может кто-нибудь объяснить?

ответ

4

В контексте вы используете эту формулировку: «Параметры шаблона» являются параметрами, которые являются шаблонами классов.Например:

template<template<typename, typename> class T, typename U, int N> 
struct { ... }; 

Здесь T является параметром шаблона, U является параметром типа и N является параметром, не-типа.

В разделе 14.1.2 он ссылается на них как на тип и не-тип, а на шаблон-параметр - на обобщение.

Здесь важно устранить проблему использования слова «шаблон». Во многих контекстах это просто используется, чтобы указать, что это параметры «шаблона» (в отличие от параметров функции, например). В этом случае эти категории становятся (соответственно) «параметры шаблона шаблона», «параметры типа шаблона» и «шаблон непиковых параметров».

Также в некоторых ситуациях считается, что первая категория определяет «непиковый параметр», поскольку аргументы, которые могут быть предоставлены для него, не являются типами (они являются шаблонами). Поэтому иногда вы можете найти формулировку «непиксельные параметры без шаблона» для ссылки строго на третью категорию (т. Е. Категорию N выше).

Также см сноска 136 пункт 14.1/2 C++ 11 стандарта на:

Поскольку шаблонов шаблонов параметры и шаблон Template-аргументы рассматриваются как типы для описательных целей, то термины параметр не-типа и аргумент non-type используются для ссылки на параметры, не относящиеся к типу, не шаблону и аргументам.

+0

+1 для определения этой сноски. –

5

Он говорит, что есть три типа -шаблона параметра:

  1. параметр Тип шаблона

    template<typename T> 
    class bar {}; 
    
  2. Non-тип параметра шаблона

    template<int N> 
    class foo {}; 
    
  3. шаблона параметр шаблона

    template<template<class> class T> 
    class baz {}; 
    

Однако я согласен, что это плохо определена. В грамматике шаблон-параметр , который начинается с template, является одним из возможных производных параметра типа.