C++模板实现printf
来源:互联网 发布:银行卡被网络支付盗刷 编辑:程序博客网 时间:2024/06/14 06:22
要函数实现接受可变的参数模型,有三种方法。
第一,通过C语言的va_list结构,以及va_start、va_arg、va_end来实现。
如:
void print(char *msg, ...){ va_list args; va_start(args, msg); ... int a = va_arg(args, int); //这里可以是int/double等等类型,根据msg来判断。 ... va_end(args);}
第二,通过c++的initializer_list模板,但接受的参数类型必须一致。
如:
void func(initializer_list<std::string> sl);
调用
func(str1);func(str1, str2);
第三,通过c++ 模板可变参数实现。
实现printf具体如下(只讨论输出int数据的情况):
【相关知识:模板、函数重载、特例化】
基本思路是通过模板的递归调用,将参数包的参数一个个取出来取代string里的%d输出符号。
#include <iostream>#include <string>using namespace std;/×函数1.这个函数要定义,若不定义问题出现如图1.和模板的实例化有关,在my_printf中sizeof...(args) == 0 的时候依然实例化了if条件的调用,为什么这样?我也不清楚了。×/ int pri_print(string &str){cout << "1 -> ";return 1;} /×模板2.此模板比模板3更具特例化,故可打破模板3的无限递归。×/ template<typename t2>int pri_print(string &str, const t2 &elem){cout << "2 -> ";auto index = str.find_first_of("%");if (index == string::npos)return 0;char num[16];sprintf(num, "%d", elem);str.replace(index, 2, num);return 1;} /×模板3.×/ template<typename t2, typename ... Args>int pri_print(string &str, const t2 &elem, const Args& ... args){cout << "3 -> ";auto index = str.find_first_of("%");if (index == string::npos)return 0;char num[16];sprintf(num, "%d", elem);str.replace(index, 2, num);pri_print(str, args...);return 1;}/×针对输出函数的第一个语句是const char *的类型,也结合上面三个函数的实现方法,故抽出再定义一个函数,其第一个参数类型为const。注意:以上函数第一个参数不是const的。×/ template<typename ... Args>int my_printf(const string &str, const Args& ... args){string str_1(str);// ...if (sizeof...(args) != 0)pri_print(str_1, args...);cout << str_1;return 1;}int main(int argc, char *argv[]){int a = 666;int b = 777;int c = 888; // 输出结果如: 图2my_printf("I am just a sentence\n");my_printf("Here a = %d\n", a);my_printf("Here a = %d, b = %d\n", a, b);my_printf("Here a = %d, b = %d, c = %d\n", a, b, c);return 0;}
图1
图2
0 0
- C++模板实现printf
- 用C++可变参数模板实现类似C语言的printf
- c语言中的printf实现
- c语言中的printf实现
- C语言 printf函数实现
- C语言实现printf函数
- c实现的printf函数
- c中printf实现atoi实现
- C++实现C语言printf函数
- C语言实现printf的部分功能
- [ASM/C/C++]c语言中的printf实现
- c printf
- C----printf()
- 【C/C++】利用可变参数模拟实现printf
- printf实现
- printf实现
- C语言实现stack模板
- C语言实现函数模板
- jspwik-2.10.2 的搭建与权限配置
- 关于C++中智能指针与类型推导的说明
- 二维数组的运算与指针
- 算法导论—KMP
- [Lintcode] Remove Duplicates from Sorted Array II
- C++模板实现printf
- 2016 与君共勉
- java笔记--什么是接口回调,怎么用
- Android动态加载dex技术初探
- Android中GridView实现长按多选功能
- 从C++转向java——3、判断与比较
- golang 的 channel 实现 生产者/消费者 模型
- hdu2883 kebab
- 制作2D追踪导弹