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 BlobBlob<int> iatemplate,如template<typename T> BlobPtr<T> BlobPtr<T>::operator++(int);template<typename T> using twin = pair<T,T>; twin<string> authors;typename,而不能使用classtemplate<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)