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

/ 6,177评论 / 22270阅读 / 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. SamuelDarse说道:

    prednisone 5mg coupon: Predni Best – prednisone 20mg by mail order

  2. RobertInpup说道:

    buy cipro online without prescription: CiPharmDelivery – cipro pharmacy

  3. Everything is very open with a precise description of the challenges. It was truly informative. Your site is very useful. Thank you for sharing.

  4. KennethCex说道:

    ciprofloxacin generic buy generic ciprofloxacin where can i buy cipro online

  5. Danielplent说道:

    https://prednibest.com/# prednisone 5mg daily

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

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

  8. Hello! I just wish to offer you a huge thumbs up for the great information you have got here on this post. I’ll be coming back to your site for more soon.

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

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

  11. SamuelDarse说道:

    ciprofloxacin over the counter: buy cipro online canada – buy cipro online

  12. KennethCex说道:

    cost cheap clomid pills clomidonpharm cost cheap clomid without prescription

  13. Тут можно преобрести сейф взломостойкий цена купить сейф взломостойкий

  14. 888b说道:

    This is the perfect blog for everyone who would like to find out about this topic. You know a whole lot its almost hard to argue with you (not that I actually will need to…HaHa). You definitely put a fresh spin on a topic which has been written about for ages. Wonderful stuff, just excellent.

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

  16. RobertInpup说道:

    can you buy clomid without insurance: how to get cheap clomid price – can you get cheap clomid online

  17. Тут можно преобрести cейф взломостойкий вломостойкие сейфы

  18. SamuelDarse说道:

    buy cipro: CiPharmDelivery – antibiotics cipro

  19. KennethCex说道:

    buy clomid pills can i get generic clomid pill how to get clomid

  20. Тут можно преобрести взломостойкие сейфы цена сейф металлический взломостойкий

  21. 888b说道:

    You are so cool! I do not think I’ve truly read through anything like that before. So great to find somebody with a few unique thoughts on this issue. Seriously.. many thanks for starting this up. This website is one thing that is needed on the web, someone with some originality.

发表回复

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