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

/ 4,993评论 / 17205阅读 / 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. Scottrok说道:

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

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

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

  4. Scottrok说道:

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

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

  6. twinklecrest说道:

    Hi i think that i saw you visited my web site thus i came to Return the favore Im attempting to find things to enhance my siteI suppose its ok to use a few of your ideas

  7. Scottshora说道:

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

  8. Scottrok说道:

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

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

  10. Scottshora说道:

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

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

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

  13. Scottshora说道:

    1хбет: 1хбет – 1xbet скачать

  14. WarrenLal说道:

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

  15. Scottshora说道:

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

  16. WarrenLal说道:

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

  17. DarrelTrini说道:

    2024 en iyi slot siteleri: bonus veren slot siteleri – slot kumar siteleri

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

  19. DarrelTrini说道:

    bonus veren slot siteleri: guvenilir slot siteleri – guvenilir slot siteleri 2024

  20. An Uunce of Weed说道:

    After going over a few of the articles on your web site, I truly appreciate your way of blogging. I saved it to my bookmark site list and will be checking back in the near future. Take a look at my web site as well and tell me your opinion.

  21. TEKTK77说道:

    Hello! I’m at work surfing around your blog from my
    new iphone 3gs! Just wanted to say I love reading your blog and look forward to
    all your posts! Keep up the excellent work!

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

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

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

  25. KevinOvems说道:

    https://slotsiteleri.bid/# en cok kazandiran slot siteleri

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

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

  28. KevinOvems说道:

    http://slotsiteleri.bid/# slot siteleri

  29. DarrelTrini说道:

    slot casino siteleri: deneme bonusu veren siteler – deneme veren slot siteleri

  30. Pretty! This has been an incredibly wonderful article. Many thanks for supplying this information.

  31. The Henry G. Friesen International Prize in Health Analysis.

  32. Hybrid funds put money into both bonds and stocks or in convertible securities.

  33. C. Closed-end companies may be either diversified or non-diversified.

  34. dbd 煽り鯖说道:

    In 2009, with Arca Cedola Funds, it is among the primary companies in the marketplace to launch revenue distribution products, with a goal maturity.

  35. Although many Pakistanis are from India, it should be noted that the country has a lot to offer.

  36. We are able to keep on my original time frame and keep trading the instruments we know work.

  37. tektok说道:

    Hello my loved one! I want to say that this article
    is awesome, nice written and include almost all important infos.
    I would like to see extra posts like this .

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

  39. winning303说道:

    Hi, constantly i used to check website posts here early in the daylight, as i like to gain knowledge of more and more.

  40. DarrelTrini说道:

    bonus veren slot siteleri: guvenilir slot siteleri – slot siteleri guvenilir

  41. tektok说道:

    I’m gone to say to my little brother, that he should also pay a quick visit this blog on regular basis to take
    updated from hottest news.

  42. Hi, I do think this is an excellent web site. I stumbledupon it 😉 I may revisit yet again since I bookmarked it. Money and freedom is the greatest way to change, may you be rich and continue to help others.

  43. tektok说道:

    Hi there friends, how is all, and what you wish for to say concerning this paragraph,
    in my view its really remarkable in support of me.

  44. naga169说道:

    I love what you guys tend to be up too. This type of clever work and reporting!
    Keep up the fantastic works guys I’ve incorporated
    you guys to our blogroll.

  45. naga169说道:

    I enjoy what you guys are usually up too. This kind of clever work and reporting!
    Keep up the good works guys I’ve included you guys
    to our blogroll.

发表回复

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