Специализируйте шаблоны функций по сравнению с функциональной перегрузкой по сравнению со специализацией класса

install.packages ("libname", lib = "file: // F: / test")

7
задан TimW 22 August 2009 в 11:02
поделиться

4 ответа

Проблема с явной специализацией шаблона функции возникает только в том случае, если функция также перегружена:

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 более ясно для разработчика, что эта функция не будет вызываться, т.е. разработчику не нужно быть гуру стандартов, чтобы знать, как правила специализации взаимодействуют с разрешением перегрузки.

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

4
ответ дан 6 December 2019 в 23:12
поделиться

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

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

2
ответ дан 6 December 2019 в 23:12
поделиться

Прежде всего, я не поддерживаю (о чем вы говорите).

Голосование обычно не гарантирует правильности; есть даже немного неправильные ответы, которые были приняты, плюс голоса за часто связаны с временем, когда был опубликован конкретный ответ и т. д.

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

2
ответ дан 6 December 2019 в 23:12
поделиться

Вы предполагаете, что все избиратели ТАК являются гуру, а не гуру. Многие технически неправильные ответы получают одобрение.

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

И обратите внимание, что в настоящее время он занимает третье место по баллам (вероятно, после этого он будет отклонен) и что еще один ответ, который используется совершенно другой подход к проблеме.

3
ответ дан 6 December 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: