template instantiation
template<typename IT, typename T>
IT find(IT first, IT last, const T& value) {
while (first != last) {
if (*first == value) {
return first;
}
first++;
}
return last;
위 예제 코드는 find에 대한 template function이다
위처럼 여러 인수를 받을 수 있다.
template<typename T, std::size_t N>
T foo(T a) {
return N*a;
}
int main() {
std::cout << foo<double, 4>(2.0) << std::endl;
std::cout << foo<double, 5>(2.0) << std::endl;
return 0;
}
출력하면 
이처럼 type이 아닌 형태도 인수로 받을 수 있다.
가끔 이런 형식의 코드도 볼 수 있는데
template <typename ...T>
void foo(T && ...args) {
(std::cout << ... << args) << '\n';
}
int main() {
foo(1, 2, 3);
foo("ABC", "nocope");
return 0;
}
c++17부터 이렇게 ...을 이용하면 인수의 개수를 유연하게 정할 수 있다.

main.cpp에 템플릿 함수 foo의 declaration만 들어있는 foo.h를 include하고
foo.cpp에서 implementation되어있다면
main.cpp는 컴파일이 되지않는다.

그래서 헤더파일에 implementation까지 몰아넣는 것이 일반적이다.