шаблон и что создается во время компиляции - PullRequest
0 голосов
/ 04 октября 2010

если у меня есть функция шаблона:

template<class T, class S>
void foo(T t, S s){..//do something//}

, а затем внутри основного я делаю это:

string str = "something";
char* ch = "somthingelse";
double num = 1.5;
foo(ch, num);
foo(num, ch);
foo(str, num);
..

Мой вопрос в компиляции, какой код будет написан висполняемый файл?это будет:

foo<char*, double>(..);
foo<double, char*>(..);
foo<string, double>(..);

или компиляция узнает при втором вызове foo, чтобы изменить место классов.или в третьем неявным образом использовать char * для создания строкового класса?

Ответы [ 3 ]

3 голосов
/ 04 октября 2010

Обычно это создает все три.Они не будут искать обходные пути по умолчанию для экономии места в двоичном изображении.

2 голосов
/ 04 октября 2010

il не будет использовать неявно

foo<string, double>(...) 

для

foo(str, num)

но вы можете явно попросить его использовать, т.е. позвонив по номеру

foo(string(str), num) 
1 голос
/ 04 октября 2010

Я думаю, что следующая цитата из стандарта проясняет это:

$ 14.9.1 / 6- "Неявные преобразования (Пункт 4) будет выполняться на аргумент функции, чтобы преобразовать его в тип соответствующей функции параметр, если тип параметра не содержит шаблонов-параметров, которые участвовать в аргументе шаблона вычет. [Примечание: параметры шаблона не участвовать в шаблоне вычет аргумента, если они явно указано. "

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...