c ++ явная реализация - шаблоны функций - замените неявную реализацию, чтобы изучить ее - PullRequest
1 голос
/ 14 августа 2011

Я читаю c ++ primer plus и у меня возникли проблемы с пониманием того, как работает неявная реализация. Я еще не изучал классы, так что я просто имею дело с функциями. Я думаю, что понимаю основы неявной реализации (шаблоны функций), но я просто не понимаю явной реализации. Ниже у меня есть функция, которая использует шаблон, может кто-нибудь показать мне, как будет написана такая функция, если она использует явное создание экземпляра. Вы можете изменить способ, которым это работает, но просто сделайте это простым. Я был бы очень признателен. Это поможет мне понять синтаксис и то, как он используется.

  2 #include <iostream>
  3 
  4 template <typename T>
  5 void show(T,T);
  6 
  7 
  8 int main()
  9 {
 10   int a = 10, b = 12;
 11   char c = 'x', d = 'y';
 12   
 13   show(a,b);
 14   show(c,d);
 15   
 16   return 0;
 17 } 
 18 
 19 template <typename T>
 20 void show(T a, T b )
 21 { 
 22   std::cout << "I used the int version " << a << " " << b << "\n";
 23 }

Ответы [ 4 ]

3 голосов
/ 14 августа 2011

Просто сделайте Show<int>(c, d) Обратите внимание, что я явно создал экземпляр версии int, но передал параметры char.Это (довольно простое) явное создание экземпляров, но вы, возможно, имеете в виду явную специализацию .

0 голосов
/ 14 августа 2011

Чтобы явно создать экземпляр вашей функции, вы хотите явно указать тип.В вашем примере замените вызовы на show на:

show<int>(a,b);
show<char>(c,d);

Вот и все.Неявная реализация просто означает, что компилятор может определить int и char из типов аргументов.

0 голосов
/ 14 августа 2011

Если вы имели в виду специализацию (которую вы называете явной реализацией) для int, то это может быть как:

template <typename T>
void show(T,T);

template <>  // specialization (not overloading) for 'int'
void show(int a, int b)
{
   std::cout << "I used the int version " << a << " " << b << "\n";
}

Если вы действительно хотите сделать явную реализацию, тогда это может быть сделано как:

show<int>(a,b);

, что на самом деле в данном случае избыточно.

0 голосов
/ 14 августа 2011

Думайте о шаблонах как о генерации кода, сродни копированию / вставке, когда вы заменяете T конкретным типом. «Instantiation» - это процесс копирования кода в вашу программу.

Неявное создание экземпляров происходит всякий раз, когда вы используете шаблон. Для шаблонов функций конкретный тип выводится из аргументов функции, а шаблон создается для этого типа. Итак, ваш код фактически становится:

void show(int a, int)   { std::cout << "I used the int version " << a << " " << b << "\n"; }
void show(char a, char) { std::cout << "I used the int version " << a << " " << b << "\n"; }

int main() { /* as it was */ }

Явное создание экземпляров, с другой стороны, просто явно заставляет компилятор генерировать код. Например, если мы добавим явный экземпляр

template void show(double, double);

к вашему коду компилятор сгенерирует соответствующий код,

void show(double a, double) { std::cout << "I used the int version " << a << " " << b << "\n"; }

Это произойдет независимо от того, действительно ли вы используете этот код.


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

...