Я читал полное руководство по шаблонам C ++ и наткнулся на этот код параметров шаблона функции, не относящийся к типу (я добавил main () и другие части, кроме определения и вызова функции ):
#include <vector>
#include <algorithm>
#include <iostream>
template <typename T, int value>
T add (T const & element){
return element + value;
}
int main() {
int a[] = {1,2,3,4};
int length = sizeof (a) / sizeof (*a);
int b[length];
std::transform (a, a + length, b, (int(*)(int const &))add <int, 5>); //why?
std::for_each (b, b + length, [](int const & value){ std::cout << value << '\n'; });
return 0;
}
Прочитав книгу, я не понял, зачем нам нужно приведение типа вызова функции?
РЕДАКТИРОВАТЬ: Объяснение из книги:
add - это шаблон функции, а шаблоны функций считаются именами набора перегруженных функций (даже если набор имеет только один член). Однако в соответствии с действующим стандартом, наборы перегруженных функций не могут использоваться для вывода параметров шаблона. Таким образом, вы должны привести к точному типу аргумента шаблона функции: ...
Компилятор: g ++ 4.5.1 в Ubuntu 10.10