C++变参模板运用实战——实现PrintLn
这篇文章围绕“如何实现支持任意参数的 PrintLn”展开,对 C++11 到 C++17 的三种主流方案做了对比式讲解。初始化列表方案的边界用 std::initializer_list 可快速实现形似的多参数打印。但该方案本质要求同构元素,无法自然支持异构参数包。因此更适合简单场景,不是泛型 PrintLn 的终态…
想要实现PrintLn,关键在于支持无限个参数的打印函数,所以我大致总结下C++能够如何去实现它!方式一:用初始化列表实现PrintLn() 【C++11】版本一:朴素初始化列表版本版本 函数版本:#include<iostream> using namespace std; void PrintLn(std::initializer_list<int> args){ for(auto arg:args){ cout<<arg<<", "; } cout<<std::endl; } int main() { PrintLn({3,23,2,12}); return 0; } 类的构造器版本(可去掉小括号):#include<iostream> using namespace std; class PrintLn { public: PrintLn(std::initializer_list<int> args) { for (auto arg:args) { cout << arg << ", "; } cout << std::endl; } }; int main() { auto t = PrintLn{3, 23, 2, 12}; return 0; } 版本二:加模板参数版本 实际上和上面的基本没太大区别,除了上面确定为了int类型,二加了模板后,可以为任意类型,但是实际上传入的还是只能是同一个类型。所以初始化列表实现是非常的不好用的。#incldue<iostream> using namespace std; template<typename T> class PrintLn { public: PrintLn(std::initializer_list<T> args) { for (auto arg:args) { cout << arg << ", "; }# PrintLn函数实现 想要实现PrintLn,关键在于支持无限个参数的打印函数,所以我大致总结下C++能够如何去实现它! ## 方式一:用初始化列表实现PrintLn() 【C++11】 ### 版本一:朴素初始化列表版本版本 > 函数版本: ```cpp #include<iostream> using namespace std; void PrintLn(std::initializer_list<int> args){ for(auto arg:args){ cout<<arg<<", "; } cout<<std::endl; } int main() { PrintLn({3,23,2,12}); return 0; } 类的构造器版本(可去掉小括号):#include<iostream> using namespace std; class PrintLn { public: PrintLn(std::initializer_list<int> args) { for (auto arg:args) { cout << arg << ", "; } cout << std::endl; } }; int main() { auto t = PrintLn{3, 23, 2, 12}; return 0; } 版本二:加模板参数版本 实际上和上面的基本没太大区别,除了上面确定为了int类型,而加了模板后,可以为任意类型,但是实际上传入的还是只能是同一个类型。所以初始化列表的方式实现Println只能说形似而神不似。#incldue<iostream> using namespace std; template<typename T> class PrintLn { public: PrintLn(std::initializer_list<T> args) { for (auto arg:args) { cout << arg << ", "; } cout << std::endl; } }; int main() { auto t = PrintLn<int>{3, 23, 2, 12}; return 0; } 方式二:用可变参模板实现 【C++11/17】 如果有了解过C的可变参函数和可变参的宏,那么这个可变参模板与它有些类型,只不过C里面的va_start,va_list,va_arg,va_end这一系列实现可变参数的宏用起来非常麻烦,而且无法确定每个参数的类型,而可变参的模板则带有模板的泛型性质,所以是能确定类型的,甚至由于模板可以传值,后面还可直接传值使用。 以下简单描述可变参模板的使用方式: typenam... 算C++的一个新的关键字,它可以用来定义一个可变参的模板类型,而这个类型在其他地方定义使用的时候也要在后…
正在初始化 WebAssembly 引擎…
首次编译原生模块可能需要数秒
就绪后,页面交互将以接近原生的速度运行