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

/ 173评论 / 1670阅读 / 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. Felipelam说道:

    http://pharmworld.store/# no prescription needed pharmacy

  2. DonaldtAg说道:

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

  3. DavidTaK说道:

    indian pharmacies safe buy medicines online in india india pharmacy

  4. Williamfug说道:

    top 10 online pharmacy in india: online shopping pharmacy india – top online pharmacy india

  5. Donaldkenty说道:

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

  6. Felipelam说道:

    http://pharmworld.store/# canadian pharmacy no prescription

  7. Williamfug说道:

    canadian pharmacy no scripts: best canadian pharmacy online – canadian online drugs

  8. DonaldtAg说道:

    buy pain meds online without prescription: how to get a prescription in canada – buying prescription medications online

  9. DavidTaK说道:

    meds online without prescription no prescription medicine online pharmacy reviews no prescription

  10. Felipelam说道:

    https://pharmindia.online/# top online pharmacy india

  11. DavidBiolo说道:

    https://levitrav.store/# Levitra 10 mg best price

  12. Elmersoalf说道:

    buy Levitra over the counter buy Levitra over the counter Levitra 10 mg best price

  13. Charlesvox说道:

    http://levitrav.store/# п»їLevitra price

  14. Georgefrege说道:

    sildenafil over the counter: viagras.online – Cheapest Sildenafil online

  15. Jamesexite说道:

    Buy Vardenafil online: Cheap Levitra online – Levitra 20 mg for sale

  16. Elmersoalf说道:

    Kamagra Oral Jelly cheap kamagra п»їkamagra

  17. Charlesvox说道:

    http://levitrav.store/# Vardenafil online prescription

  18. Tylerreunk说道:

    https://viagras.online/# Order Viagra 50 mg online

  19. Jamesexite说道:

    Generic Cialis without a doctor prescription: Generic Tadalafil 20mg price – Cialis 20mg price

  20. Elmersoalf说道:

    Buy Levitra 20mg online Vardenafil online prescription Buy Levitra 20mg online

  21. Charlesvox说道:

    http://cenforce.pro/# cenforce.pro

  22. DavidBiolo说道:

    http://cialist.pro/# Generic Cialis price

  23. Jamesexite说道:

    Tadalafil price: Generic Cialis price – Generic Tadalafil 20mg price

发表回复

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