LINUX.ORG.RU

Вопросы

 , ,


1

6

Я тут давеча решил полистать cppreference.com http://en.cppreference.com/w/cpp/language/function_template, накопилось пара вопросов. Наверняка там же и ответы есть (надо проштудировать Overload resolution, ADL, и сотню дополнительных ссылок, которые накопятся при чтении вышеназванных :) ), но там голые цитаты из стандарта, ухватить суть не всегда просто (читать буду, кончено). Может просто поговорим, глядишь, и прояснится чего-нибудь.
1.

template<class...> struct Tuple { };
template<class... T> void f(Tuple<T...>);   // #1
template<class... T> void f(Tuple<T&...>);  // #2
template<class... T> void q(T...);          // #3
template<class... T> void q(T&...);         // #4

int main()
{
  f(Tuple<>{}); // calls #2
  // но почему-то
  q();          // call to 'q' is ambiguous
}
2. А вот это меня реально удивило.
template< class T > void f(T);     // #1 
template<>          void f(int*);  // #2
template< class T > void f(T*);    // #3

f(new int(1));  // calls #3
// Но если поменять местами #2 и #3, то вызывает #2
3. Ну так, немного не по теме. Есть задача: выводить график из нескольких миллионов точек + иметь возможность: масштабировать, прокручивать, графические построения конечным пользователем (например, построить линию от точки 5 до точки 1000). Как лучше реализовать? Формировать самому какой-нибудь bitmap и выводить на экран или можно как-то более высокоуровнего? Я пока особо не размышлял, но чей-то опыт пригодится.

По 2 пункту: похоже что перестановка 2 изменяет то какую шаблонную функцию он он специализирует. Т.е. в оригинале 2 специализирует 1, а после перестановки 2 специализирует 3. При поиске подходящей функции компилятор в первую очередь рассматривает перегрузки, и только после этого специализацию (для выбранной перегрузки).

В обоих случаях перегрузкой выбирается 3, но во втором случае для 3 есть еще и подходящая специализация 2.

Note that only non-template and primary template overloads participate in overload resolution. The specializations are not overloads and are not considered. Only after the overload resolution selects the best-matching primary function template, its specializations are examined to see if one is a better match.

four_str_sam ()
Последнее исправление: four_str_sam (всего исправлений: 1)
Ответ на: комментарий от four_str_sam

Наверное, так и есть. Спасибо.

ЗЫ: Мне нужно отлучится, отвечать не смогу (отпишусь позже). Но вы пишите, не стесняйтесь.

pavlick ()
Последнее исправление: pavlick (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.