[c++模板] 用可变参数模板来实现 printf

/ 2,706评论 / 10991阅读 / 3点赞

模板

// 普通函数, 只能接受 int 类型参数,如果传入其他类型需要类型转换
int sum(int a, int b) {
    return (a + b);
}

double sum(double a, double b) {
    return (a + b);
}
// 模板
template<typename T>
T sum(T a, T b) {
    return (a + b);
}

// 编译会生成:
int sum(int a, int b) {
    return (a + b);
}
double sum(double a, double b) {
    return (a + b);
}

可变参数模板

int sum(int a, int b, int c) {
    return (a + b + c);
}

int sum(int a, int b, int c, int d) {
    return (a + b + c + d);
}
// ......
template<typename T>
T sum(T... args) {
    // 展开求和
}
template<typename T>
T mysum(T item) {
    return item;
}
template<typename T>
T mysum(T item, T... args) {
    return mysum(item) + mysum(args);
}
/// 入口
template<typename T>
T sum(T... args) {
    return mysum(args);
}
int sum(int arg0, int arg1, int arg2, int arg3, int arg4);
int mysum(int item, int arg1, int arg2, int arg3, int arg4);
int mysum(int item);
int mysum(int item, int arg2, int arg3, int arg4);
int mysum(int item, int arg3, int arg4);
int mysum(int item, int arg4);

不定类型数量

template<typename T1, typename T2, typename ...Args>
T1 mysum(T2 item, Args... args);

实现printf

template<typename T>
int printNum(const std::string& str, int index, T&& item) {
	auto doShift = true;
	while (index < str.size()) {
		if (index == (str.size() - 1) || str[index] != '%') {
			cout << str[index];
			++index;
		}
		else if(doShift) {
			doShift = false;
			++index;
			switch (str[index]) {
			case 's':
			case 'd':
				cout << item;
				break;
			}
			++index;
		}
		else {
			return index - 1;
		}
	}
	return index - 1;
}

template<typename T, typename... Args>
int printNum(const std::string& str, int index, T&& item, Args&&... args) {
	index = printNum(str, index, item);
	return printNum(str, index + 1, std::forward<Args>(args)...);
}

template<typename ...Args>
void myPrintNum(const std::string& str, Args&&... args) {
	int index = 0;
	while (index < str.size()) {
		if (str[index] != '%') {
			cout << str[index];
			++index;
		}
		else {
			break;
		}
	}
	index = printNum(str, index, std::forward<Args>(args)...);
	++index;
	while (index < str.size()) {
		cout << str[index];
		++index;
	}
}

int main() {

        // 调用,参数数量允许和字符串内数量不同,不会出错
	myPrintNum("output: %d, %d, %d, %d  ---", 123, 100.123, true);
	return 0;
}
  1. DominicHOr说道:

    reputable mexican pharmacies online: mexican rx online – purple pharmacy mexico price list

  2. NelsonSaIlk说道:

    pharmacies in mexico that ship to usa: buying from online mexican pharmacy – mexico drug stores pharmacies

  3. Waynetar说道:

    mexican border pharmacies shipping to usa: reputable mexican pharmacies online – medication from mexico pharmacy

  4. DominicHOr说道:

    buying prescription drugs in mexico: п»їbest mexican online pharmacies – mexican rx online

  5. Arnoldscava说道:

    purple pharmacy mexico price list pharmacies in mexico that ship to usa mexican online pharmacies prescription drugs

  6. Waynetar说道:

    buying prescription drugs in mexico: purple pharmacy mexico price list – buying prescription drugs in mexico

  7. DominicHOr说道:

    п»їbest mexican online pharmacies: mexican mail order pharmacies – mexican mail order pharmacies

  8. Arnoldscava说道:

    mexico pharmacy mexican border pharmacies shipping to usa mexican mail order pharmacies

  9. Waynetar说道:

    mexican rx online: mexican rx online – mexican drugstore online

  10. DominicHOr说道:

    purple pharmacy mexico price list: п»їbest mexican online pharmacies – mexico drug stores pharmacies

  11. NelsonSaIlk说道:

    mexican rx online: mexico pharmacies prescription drugs – mexico drug stores pharmacies

  12. NelsonSaIlk说道:

    reputable mexican pharmacies online: mexico drug stores pharmacies – mexico pharmacies prescription drugs

  13. NelsonSaIlk说道:

    mexico drug stores pharmacies: buying from online mexican pharmacy – mexican online pharmacies prescription drugs

  14. Arnoldscava说道:

    mexican border pharmacies shipping to usa mexican mail order pharmacies buying prescription drugs in mexico online

  15. Waynetar说道:

    mexican rx online: mexican rx online – mexican rx online

  16. DominicHOr说道:

    mexico pharmacies prescription drugs: best online pharmacies in mexico – mexican rx online

  17. NelsonSaIlk说道:

    medication from mexico pharmacy: mexican pharmaceuticals online – п»їbest mexican online pharmacies

  18. Waynetar说道:

    mexico drug stores pharmacies: medication from mexico pharmacy – mexican rx online

  19. DominicHOr说道:

    mexican rx online: best online pharmacies in mexico – mexican pharmaceuticals online

  20. Arnoldscava说道:

    п»їbest mexican online pharmacies buying prescription drugs in mexico reputable mexican pharmacies online

  21. Waynetar说道:

    medication from mexico pharmacy: mexican mail order pharmacies – pharmacies in mexico that ship to usa

  22. Arnoldscava说道:

    mexican border pharmacies shipping to usa reputable mexican pharmacies online buying prescription drugs in mexico

  23. DominicHOr说道:

    buying from online mexican pharmacy: mexico drug stores pharmacies – mexico drug stores pharmacies

  24. Arnoldscava说道:

    mexican border pharmacies shipping to usa mexican rx online medication from mexico pharmacy

  25. Waynetar说道:

    mexican border pharmacies shipping to usa: buying prescription drugs in mexico online – mexican drugstore online

  26. DominicHOr说道:

    mexican pharmaceuticals online: buying from online mexican pharmacy – best online pharmacies in mexico

  27. Tooft说道:

    Tanto si utilizas Windows, Mac o Linux, otra opción válida a la hora de guardar tus criptomonedas es utilizar un monedero de escritorio. Es simplemente un programa que se instala en tu ordenador y que automáticamente crea tu monedero, muchas veces sin necesidad de ningún tipo de registro ni proporcionar información personal (ni siquiera tu e-mail). Si vas a hacer trading o intercambiar tus criptomonedas de forma activa, Binance es sin dudas la mejor opción para ti. Es una de las más utilizadas y reconocidas como wallet para bitcoin. Es muy intuitiva y fácil de usar, y cuenta con Lightning Network. ¿Qué es esto? El protocolo Lightning Network está pensado para optimizar la escalabilidad de Bitcoin. Es algo así como ‘una segunda capa’ sobre esta criptomoneda, que le permite realizar transacciones de manera prácticamente instantánea y con comisiones más bajas.
    https://wiki-cafe.win/index.php?title=Long_en_criptomonedas
    Enlaces de interés Bitcoin: reserva de valor o inversión especulativa Un bitcoin (en minúsculas) es el nombre que recibe una unidad de la criptomoneda Bitcoin y cuya representación es: 1 BTC. Un bitcoin es una unidad divisible, de hecho, cada bitcoin puede dividirse hasta los ocho decimales, lo que te permite manejar cada bitcoin en fracciones muy pequeñas, según lo requieras. Estas unidades más pequeñas de bitcoin reciben el nombre de “satoshis” y puedes manejarlas también para enviar y recibir pagos de bitcoin, porque al llegar a los 100.000.000 satoshis, obtienes el equivalente a 1 BTC. Enlaces de interés Las acciones mundiales subieron a finales de esta semana debido a que los datos económicos de todo el mundo generaron esperanzas de que la economía podría enfrentar un aterrizaje más suave de lo que se temía hace unos meses, incluso cuando las tasas de interés amenazan con permanecer más altas de lo esperado.

  28. NelsonSaIlk说道:

    pharmacies in mexico that ship to usa: buying from online mexican pharmacy – п»їbest mexican online pharmacies

  29. NelsonSaIlk说道:

    mexican online pharmacies prescription drugs: mexican border pharmacies shipping to usa – buying prescription drugs in mexico online

  30. Arnoldscava说道:

    purple pharmacy mexico price list mexico pharmacies prescription drugs mexican rx online

  31. Waynetar说道:

    medication from mexico pharmacy: buying prescription drugs in mexico – pharmacies in mexico that ship to usa

  32. Whats up are using WordPress for your site platform? I’m new to the blog world but I’m trying to get started and set up my own. Do you require any coding expertise to make your own blog? Any help would be really appreciated!

  33. NelsonSaIlk说道:

    medicine in mexico pharmacies: buying prescription drugs in mexico – purple pharmacy mexico price list

  34. Waynetar说道:

    mexican border pharmacies shipping to usa: mexican online pharmacies prescription drugs – mexico pharmacies prescription drugs

  35. DominicHOr说道:

    buying prescription drugs in mexico online: п»їbest mexican online pharmacies – pharmacies in mexico that ship to usa

  36. Arnoldscava说道:

    pharmacies in mexico that ship to usa mexico drug stores pharmacies buying from online mexican pharmacy

  37. Arnoldscava说道:

    mexican pharmacy mexican online pharmacies prescription drugs mexican online pharmacies prescription drugs

  38. Waynetar说道:

    best online pharmacies in mexico: mexico pharmacies prescription drugs – reputable mexican pharmacies online

  39. DominicHOr说道:

    mexico drug stores pharmacies: mexican mail order pharmacies – medicine in mexico pharmacies

  40. Arnoldscava说道:

    reputable mexican pharmacies online medicine in mexico pharmacies buying prescription drugs in mexico

  41. DominicHOr说道:

    mexican drugstore online: pharmacies in mexico that ship to usa – pharmacies in mexico that ship to usa

  42. NelsonSaIlk说道:

    best online pharmacies in mexico: buying prescription drugs in mexico online – mexican mail order pharmacies

  43. NelsonSaIlk说道:

    buying prescription drugs in mexico: mexican online pharmacies prescription drugs – mexico drug stores pharmacies

  44. NelsonSaIlk说道:

    best online pharmacies in mexico: mexican border pharmacies shipping to usa – pharmacies in mexico that ship to usa

  45. Arnoldscava说道:

    buying prescription drugs in mexico online mexican drugstore online reputable mexican pharmacies online

  46. Waynetar说道:

    mexico pharmacies prescription drugs: purple pharmacy mexico price list – buying prescription drugs in mexico online

  47. DominicHOr说道:

    buying prescription drugs in mexico: medicine in mexico pharmacies – mexican pharmaceuticals online

  48. RichardMonge说道:

    http://mexicandeliverypharma.com/# buying from online mexican pharmacy

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注