Нестандартные параметры шаблона

Я понимаю, что параметр шаблона непигового типа должен быть постоянным интегральным выражением. Может ли кто-то пролить свет, почему это так?

template  void foo() { // ... } 
 error C2993: 'std::string' : illegal type for non-type template parameter 'temp'. 

Я понимаю, что такое постоянное интегральное выражение. Каковы причины не допускать нестационарные типы, такие как std::string как в приведенном выше fragmentе?

Причина, по которой вы не можете сделать это, заключается в том, что не константные выражения не могут быть проанализированы и заменены во время компиляции. Они могут меняться во время выполнения, что потребует генерации нового шаблона во время выполнения, что невозможно, потому что шаблоны являются концепцией времени компиляции.

Вот что стандарт позволяет использовать параметры шаблона непигового типа (14.1 [temp.param] p4):

Параметр шаблона, не относящийся к типу, должен иметь один из следующих (необязательно cv-квалифицированных) типов:

  • интегрального или перечисляемого типа,
  • указатель на объект или указатель на функцию,
  • lvalue ссылка на объект или lvalue ссылку на функцию,
  • указатель на член,
  • std::nullptr_t .

Это недопустимо.

Однако это разрешено:

 template  //pointer to object void f(); template  //reference to object void g(); 

См. §14.1 / 6,7,8 в Стандарте C ++ (2003).


Иллюстрация:

 template  //pointer to object void f() { cout << *temp << endl; } template  //reference to object void g() { cout << temp << endl; temp += "...appended some string"; } std::string s; //must not be local as it must have external linkage! int main() { s = "can assign values locally"; f<&s>(); g(); cout << s << endl; return 0; } 

Вывод:

 can assign values locally can assign values locally can assign values locally...appended some string 

Вы должны уметь манипулировать аргументами шаблона

 template  void f() { // ... } f<"foo">(); f<"bar">(); // different function!? 

Теперь имплантированию необходимо будет создать уникальную последовательность символов для std::string или, если на то пошло, любого другого произвольно определенного пользователем classа, сохраняющего определенное значение, значение которого неизвестно реализации. И кроме того, значение произвольных объектов classа невозможно вычислить во время компиляции.

Планируется рассмотреть возможность использования типов литералов в виде типов шаблонов для пост-C ++ 0x, которые инициализируются постоянными выражениями. Это может быть искажено, если элементы данных рекурсивно искалечены в соответствии со своими значениями (для базовых classов, например, мы можем применить обход глубины, сначала слева направо). Но это определенно не будет работать для произвольных classов.

Аргумент шаблона без типа, представленный в списке аргументов шаблона, представляет собой выражение, значение которого может быть определено во время компиляции. Такими аргументами должны быть:

постоянные выражения, адреса функций или объектов с внешней связью или адреса статических членов classа.

Кроме того, строковые литералы – это объекты с внутренней связью, поэтому вы не можете использовать их в качестве аргументов шаблона. Вы также не можете использовать глобальный указатель. Литералы с плавающей точкой не допускаются, учитывая очевидную возможность ошибок округления.

  • Сохранение определений функций шаблонов C ++ в файле .CPP
  • Razor рассматривает как шаблоны электронной почты
  • Laravel 5 - глобальная переменная вида Blade, доступная во всех шаблонах
  • JQuery's $ находится в конфликте с StringTemplate.Net в ASP.Net MVC
  • Проблема с шаблоном вызывает ошибку компоновщика (C ++)
  • Можно ли использовать другой шаблон для выбранного элемента в WPF ComboBox, чем для элементов в раскрывающемся списке?
  • Как явным образом создаю экземпляр функции шаблона?
  • Когда использовать std :: forward для пересылки аргументов?
  • C ++ 11 не выводит тип, когда задействованы функции std :: function или lambda
  • jQuery шаблоны двигателей
  • Что такое руководства по вычитанию шаблонов и когда мы должны их использовать?
  • Interesting Posts

    Capybara с субдоменами – default_host

    Почему нельзя синхронизировать конструкторы Java?

    Можно ли использовать mongodb как встроенную базу данных?

    objective ACTION_VIEW для файла с неизвестным MimeType

    Пропустить параметр между страницами с помощью jquery mobile

    Растянуть текст JLabel

    MongoDB: Объедините данные из нескольких коллекций в один … как?

    Каковы типы MIME Google Apps в Документах Google и Google Диске?

    Надежно удалите пустое место на диске в системе Win 3.1 / DOS 6.22 со встроенными инструментами

    Не удалось добавить оконный токен android.os.BinderProxy недействителен; работает ли ваша деятельность?

    jquery .live (‘click’) vs .click ()

    Как вставить записи реестра из .reg-файла в 32-разрядный реестр в 64-разрядной Windows

    Можно ли удалить URL-адрес из моего css-файла печати, чтобы веб-адрес не печатался?

    Есть ли работающий инструмент рефакторинга C ++?

    Как центрировать изображение, если оно больше, чем его контейнер?

    Давайте будем гением компьютера.