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

/ 4,994评论 / 17211阅读 / 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. Если вы искали где отремонтировать сломаную технику, обратите внимание – ремонт бытовой техники в барнауле

  2. Профессиональный сервисный центр по ремонту источников бесперебойного питания.
    Мы предлагаем: стоимость ремонта ибп
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  3. Профессиональный сервисный центр по ремонту Apple iPhone в Москве.
    Мы предлагаем: мастер ремонта apple
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  4. Если вы искали где отремонтировать сломаную технику, обратите внимание – ремонт бытовой техники

  5. Scottshora说道:

    1win: ван вин – 1win

  6. Scottshora说道:

    пин ап казино: пин ап казино вход – пин ап зеркало

  7. Scottshora说道:

    1вин: 1win зеркало – 1вин официальный сайт

  8. WarrenLal说道:

    https://vavada.auction/# vavada зеркало

  9. Your style is unique compared to other folks I’ve read stuff from. Thank you for posting when you’ve got the opportunity, Guess I’ll just book mark this web site.

  10. I wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post

  11. Scottshora说道:

    вавада зеркало: vavada online casino – vavada online casino

  12. Scottshora说道:

    казино вавада: vavada – вавада

  13. WarrenLal说道:

    https://pin-up.diy/# pin up casino

  14. Scottshora说道:

    1win: 1win вход – ван вин

  15. WarrenLal说道:

    https://pin-up.diy/# пинап казино

  16. Scottrok说道:

    пин ап: pin up казино – пин ап казино

  17. Профессиональный сервисный центр по ремонту источников бесперебойного питания.
    Мы предлагаем: обслуживание ибп цена
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  18. Если вы искали где отремонтировать сломаную технику, обратите внимание – ремонт бытовой техники в новосибирске

  19. Профессиональный сервисный центр по ремонту Apple iPhone в Москве.
    Мы предлагаем: ремонт айфона на дому в москве
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  20. Scottrok说道:

    пин ап вход: пин ап зеркало – pin up

  21. WarrenLal说道:

    http://pin-up.diy/# пин ап казино вход

  22. WarrenLal说道:

    https://1xbet.contact/# 1xbet зеркало

  23. Scottshora说道:

    1хбет зеркало: 1xbet – 1xbet зеркало рабочее на сегодня

  24. Scottshora说道:

    1xbet скачать: 1хбет официальный сайт – 1xbet официальный сайт мобильная версия

  25. Scottshora说道:

    vavada зеркало: vavada online casino – казино вавада

  26. Профессиональный сервисный центр по ремонту бытовой техники с выездом на дом.
    Мы предлагаем:сервис центры бытовой техники петербург
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  27. Профессиональный сервисный центр по ремонту ноутбуков и компьютеров.дронов.
    Мы предлагаем:качественный ремонт ноутбуков
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  28. Scottshora说道:

    1xbet официальный сайт мобильная версия: 1хбет зеркало – 1хбет официальный сайт

  29. Scottrok说道:

    пин ап: пин ап зеркало – pin up казино

  30. Lesliehig说道:

    зеркало 1хбет 1xbet зеркало рабочее на сегодня зеркало 1хбет

  31. Scottrok说道:

    пин ап вход: пин ап – pin up казино

  32. Lesliehig说道:

    ван вин 1вин официальный сайт 1win вход

  33. WarrenLal说道:

    http://pin-up.diy/# pin up казино

  34. Если вы искали где отремонтировать сломаную технику, обратите внимание – профи екб

  35. WarrenLal说道:

    https://1win.directory/# 1вин официальный сайт

  36. Scottrok说道:

    пин ап: pin up casino – пин ап казино вход

  37. Scottshora说道:

    1win официальный сайт: 1вин официальный сайт – ван вин

  38. Scottshora说道:

    1xbet: 1xbet официальный сайт – 1xbet скачать

  39. Lesliehig说道:

    пин ап казино вход пинап казино пин ап

  40. WarrenLal说道:

    https://1win.directory/# 1win зеркало

  41. Scottshora说道:

    1вин официальный сайт: 1вин – 1win официальный сайт

  42. WarrenLal说道:

    http://pin-up.diy/# пин ап казино

  43. Lesliehig说道:

    1xbet зеркало рабочее на сегодня 1xbet скачать 1xbet зеркало

  44. Если вы искали где отремонтировать сломаную технику, обратите внимание – ремонт бытовой техники

  45. Scottrok说道:

    пин ап вход: пин ап казино – pin up

  46. Профессиональный сервисный центр по ремонту бытовой техники с выездом на дом.
    Мы предлагаем:сервисные центры по ремонту техники в спб
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

  47. Профессиональный сервисный центр по ремонту радиоуправляемых устройства – квадрокоптеры, дроны, беспилостники в том числе Apple iPad.
    Мы предлагаем: ремонт дронов в москве
    Наши мастера оперативно устранят неисправности вашего устройства в сервисе или с выездом на дом!

发表回复

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