install.packages ("libname", lib = "file: // F: / test")
Проблема с явной специализацией шаблона функции возникает только в том случае, если функция также перегружена:
template <typename T> void foo (T*); // #1
template <typename T> void foo (T); // #2
template <> void foo<int*> (int*);
int main () {
int * i;
foo (i); // Calls #1 not specialization of #2
}
Без перегрузки №1 код будет работать должным образом. Однако функция, которая вначале не перегружается, может иметь добавленные перегрузки, поскольку код сохраняется в будущем.
Это один из тех примеров, когда, хотя я ненавижу это говорить, у C ++ слишком много способов сделать то же самое. вещь. Лично, если вы обнаружите, что вам нужно специализировать шаблон функции, то мне понравится шаблон, предложенный TimW в его комментарии к ответу Нила Баттерворта , т.е. лучше всего сделать это, если текущая функция отправит ее вызов в специализированный шаблон класса:
template <typename T> class DoFoo {
static void do (T) { /* default behaviour */ }
};
template <> class DoFoo<int*> {
static void do (int*) { /* int * behaviour */ }
};
template <typename T> void foo (T t)
{
DoFoo<T>::do (t);
}
Если 'foo' перегружен, то по крайней мере он ' s более ясно для разработчика, что эта функция не будет вызываться, т.е. разработчику не нужно быть гуру стандартов, чтобы знать, как правила специализации взаимодействуют с разрешением перегрузки.
Однако в конечном итоге код, сгенерированный компилятором, будет таким же, это чисто проблема понимания кода на со стороны разработчика.
Как указал Нил, за наиболее правильные ответы будет проводиться голосование. И ответы, которые уже находятся наверху, по моему опыту, как правило, получают еще больше голосов.
Относительно того, почему: я полагаю, что специализированные шаблоны функций легче понять, поэтому именно это делает их предпочтительными в примере кода.
Прежде всего, я не поддерживаю (о чем вы говорите).
Голосование обычно не гарантирует правильности; есть даже немного неправильные ответы, которые были приняты, плюс голоса за часто связаны с временем, когда был опубликован конкретный ответ и т. д.
К вашей проблеме и статье: я прочитал статью и не вижу любой аргумент в пользу того, что вы предлагаете, неприменим к простой перегрузке функции (шаблона). Уловка в основном делает то же самое, что и компилятор, если вы использовали специализации шаблонов функций (включая частичные, если они были разрешены), со всеми недостатками, о которых Херб Саттер говорит в статье. Итак, я не думаю, что ваш путь «правильный» (по вашим словам), я просто считаю, что это уродливый способ достичь того, что вам не нужно.
Вы предполагаете, что все избиратели ТАК являются гуру, а не гуру. Многие технически неправильные ответы получают одобрение.
Как автор ответа, который, я думаю, вы имеете в виду , ну, как я сказал в своем комментарии, это не проблема Я забочусь (или знаю) все, потому что очень редко использую специализация шаблона. Я полагаю, что мог бы удалить ответ, но он технически правильный и, похоже, вызвал некоторые полезные дискуссии по этой теме.
И обратите внимание, что в настоящее время он занимает третье место по баллам (вероятно, после этого он будет отклонен) и что еще один ответ, который используется совершенно другой подход к проблеме.