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

/ 5,156评论 / 17607阅读 / 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. Derekjup说道:

    6 prednisone: prednisone – how much is prednisone 5mg

  2. Oh my goodness! Awesome article dude! Thanks, However I am going through issues with your RSS. I don’t understand the reason why I am unable to join it. Is there anybody else having identical RSS issues? Anyone that knows the solution can you kindly respond? Thanks!

  3. Brandenven说道:

    can i order cheap clomid prices: can you buy generic clomid without prescription – how can i get generic clomid without dr prescription

  4. Derekjup说道:

    generic amoxil 500 mg: buy amoxil online – buy amoxicillin 500mg capsules uk

  5. Brandenven说道:

    buy amoxicillin 500mg online: Amoxicillin for sale – amoxicillin buy canada

  6. Derekjup说道:

    amoxicillin order online no prescription: Amoxicillin buy online – cost of amoxicillin 875 mg

  7. Brandenven说道:

    buy amoxicillin without prescription: cheap amoxil – where can you get amoxicillin

  8. Тут можно преобрести оружейные шкафы и сейфы шкаф оружейный

  9. Brandenven说道:

    cheap priligy: buy dapoxetine online – priligy max pharm

  10. StevenWearo说道:

    prednisone 50 mg tablet cost: cheap prednisone – prednisone 5 mg tablet rx

  11. DanielArill说道:

    where can i buy amoxicillin over the counter uk https://amoxilcompharm.com/# cost of amoxicillin 875 mg

  12. Derekjup说道:

    amoxicillin capsule 500mg price: where can you get amoxicillin – amoxicillin 500mg price canada

  13. Тут можно преобрести купить шкаф оружейный сейф для оружия купить

  14. StevenWearo说道:

    amoxicillin 500mg buy online canada: Amoxicillin buy online – amoxicillin 500mg capsule

  15. Узнай все о варикоцеле 1 степени варикоцеле у мужчин

  16. Brandenven说道:

    max pharm: dapoxetine online – priligy

  17. Derekjup说道:

    amoxicillin online purchase: Amoxicillin Com Pharm – amoxicillin 500mg capsules price

  18. Brandenven说道:

    can i buy clomid without rx: rexpharm – clomid without prescription

  19. Узнай все о варикоцеле причины варикоцеле симптомы

  20. StevenWearo说道:

    cost of generic clomid: cheap clomid – where to buy cheap clomid online

  21. Тут можно преобрести купить сейф для ружья оружейный шкаф

  22. Bradleyarrip说道:

    priligy maxpharm buy priligy buy priligy max pharm

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

  24. Узнай все о варикоцеле у мужчин варикоцеле симптомы

  25. StevenWearo说道:

    amoxicillin generic: amoxicillin cephalexin – order amoxicillin 500mg

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

  27. check here说道:

    Aw, this was an extremely good post. Taking a few minutes and actual effort to make a superb article… but what can I say… I procrastinate a lot and never seem to get anything done.

  28. Brandenven说道:

    amoxicillin without a prescription: com pharm – amoxil pharmacy

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

  30. Derekjup说道:

    prednisone 20mg prices: prednisoneraypharm – prednisone nz

  31. porn说道:

    This website was… how do I say it? Relevant!! Finally I have found something which helped me. Cheers.

  32. Pretty! This has been an extremely wonderful post. Thanks for supplying this info.

  33. Brandenven说道:

    priligy maxpharm: cheap priligy – priligy

  34. Узнай все о варикоцеле у мужчин лапароскопия варикоцеле

  35. StevenWearo说道:

    no prescription prednisone canadian pharmacy: buy prednisone – prednisone 60 mg

  36. Тут можно преобрести оружейный сейф для пистолета шкаф оружейный

  37. Bradleyarrip说道:

    Priligy tablets Priligy tablets max pharm

  38. Derekjup说道:

    priligy: max pharm – dapoxetine online

  39. I blog frequently and I genuinely appreciate your information. Your article has truly peaked my interest. I will book mark your website and keep checking for new details about once a week. I subscribed to your RSS feed too.

  40. Тут можно преобрести оружейный сейф на заказ москва оружейный шкаф купить в москве

  41. DanielArill说道:

    buy amoxicillin over the counter uk https://amoxilcompharm.com/# buy cheap amoxicillin

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

  43. Bradleyarrip说道:

    cost of prednisone in canada cheap prednisone prednisone

  44. Brandenven说道:

    amoxicillin no prescipion: com pharm – where to buy amoxicillin pharmacy

  45. Узнай все о двустороннее варикоцеле варикоцеле и потенция

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

  47. Brandenven说道:

    buy cheap amoxicillin online: Com Pharm – amoxicillin cephalexin

发表回复

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