template <typename T, class U> calc (const T&, const U&)
template<unsigned N,unsigned M> int compare (const char (&p1)[N], const char (&p2)[M])
给出数组长度inline
与constexpr
放在模板参数列表之后,返回类型之前less
代替<
,且不用>
template<typename T> class Blob
Blob<int> ia
template
,如template<typename T> BlobPtr<T> BlobPtr<T>::operator++(int);
template<typename T> using twin = pair<T,T>; twin<string> authors;
typename
,而不能使用class
template<typename T = less<T>>
,之后声明时可用空<>来代表使用默认类型extern template class Blob<string>
实例化声明,在程序某个位置必须有其显式的实例化定义
const
转换和数组或函数到指针的转换<T,T>
,则不能实例化为<long,int>
,必须定义两个模板<U,T>
才可template<typename T1, typename T2, typename T3>
T1 sum(T2, T3);
// T1 显式指定,T2 T3从函数实参类型推断而来
auto val3 = sum<long long>(i, lng); // long long sum(int, long)
// 糟糕的设计
template<typename T1, typename T2, typename T3>
T3 sum(T2, T1);
// 则需要指定所有实参
auto val3 = sum<long long, int, long>(i,lng);
template<typename It>
auto fcn(It beg, It end) -> decltype(*beg)
// 标准库类型转换模板 <type_traits> 包含模板元程序设计
// 下面的函数可返回具体的值
template<typename It>
auto fcn(It beg, It end) ->
typename remove_reference<decltype(*beg)>::type
X& &
、X& &&
、X&& &
都折叠成X&
X&& &&
折叠成X&&
// 标准库的move
template<typename T>
typename remove_reference<T>::type&& move(T&& t)
{
return static_cast<typename remove_reference<T>::type&&>(t);
}
// 通过引用折叠可实现给move左值也可给其右值
template <typename T, typename... Args>
void foo(const T& t, const Args&... rest);
// sizeof可获得元素数目
sizeof...(Args)
template<typename T> int compare(const T&, const T&);
// compare的特殊版本,处理字符数组指针
template<>
int compare(const char* const& p1, const char* const &p2)