// // 2.6.cpp // c++1x tutorial // // created by changkun at shiyanlou.com // // 模板增强 #include #include #include template class std::vector; // 强行实例化 extern template class std::vector; // 不在该编译文件中实例化模板 template< typename T, typename U, int value> class SuckType { public: T a; U b; SuckType():a(value),b(value){} }; // template< typename T> // typedef SuckType, T, 1> NewType; // 不合法 template using NewType = SuckType; // 合法 // 默认模板类型 template auto add(T x, U y) -> decltype(x+y) { return x+y; } // sizeof... template void magic(Args... args) { std::cout << sizeof...(args) << std::endl; } // 1. 递归解参数包 template void printf1(T value) { std::cout << value << std::endl; } template void printf1(T value, Args... args) { std::cout << value << std::endl; printf1(args...); } // 2.初始化列表展开解参数包 template auto printf2(T value, Args... args) { std::cout << value << std::endl; return std::initializer_list{([&] { std::cout << args << std::endl; }(), value)...}; } int main() { std::vector> wow; // 注意尖括号 NewType t; magic(); magic(1); magic(1,""); printf1(1, 2.3, "abc"); printf2(1, 2.3, "abc"); return 0; }