C++11——不定参数模板

不定参数模板,顾名思义。

Template.h

#pragma once
#include <stdarg.h>//标准参数:模拟可变参数必需的头文件


template<class Type>
class CCTemplate
{
public:
	CCTemplate() {}
	~CCTemplate() {}

	void* operator new(size_t nSize)
	{
		return malloc(nSize);
	}

	void operator delete(void* p)
	{
		free(p);
	}

	// 多参数模板 不定参数 可变参数
	template<class ...Args>
	static Type* CreateObject(Args... args)
	{
		Type* obj = new Type(args...);
		return obj;
	}

	static void DeleteObject(Type* obj)
	{
		delete(obj);
	}
};

class ClassA : public CCTemplate<ClassA>
{
public:
	ClassA(int n)
	{
		m_n = n;
	}
	~ClassA() {  }
private:
	int m_n;
};


class ClassB : public CCTemplate<ClassB>
{
public:
	ClassB(int n, int m)
	{
		m_n = n;
		m_X = m;
	}
	~ClassB() {  }

	// 可变参数模板  加法
	template<typename T, typename ... Args>
	int Add(T num, Args... args)
	{
		int res = 0;//结果
		va_list argp;			//存储参数开始的地址
		va_start(argp, num);	//从首地址开始,读取num后面的数据
		for (int i = 0; i < num; i++)
		{
			//读取一个数据并且按照int类型进行二进制数据的解析
			//然后读取下一个数据
			res += va_arg(argp, int);
		}
		va_end(argp);//结束读取
		return res;
	}
private:
	int m_n;
	int m_X;
};

main函数调用:

// C++11Demo.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "XMacro.h"
#include <time.h>
#include <thread>
#include "Function.h"
#include "Thread.h"
#include <iomanip>
#include "Template.h"
#include <iostream>
#include "Mutex.hpp"

#pragma warning( disable : 4996 )
/*
1. X宏
2. std::function
3. std::bind
4. std::for_each
5. Lambda表达式
6. std::atomic
7. auto
8. std::thread
9. 模板
10. 模板
*/
using namespace XMacro;

#define Tab printf("\n");

// 获取当时系统时间
const std::string GetCurrentSystemTime()
{
	auto t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
	struct tm* ptm = localtime(&t);
	char date[60] = { 0 };
	sprintf(date, "%d-%02d-%02d %02d:%02d:%02d",
		(int)ptm->tm_year + 1900, (int)ptm->tm_mon + 1, (int)ptm->tm_mday,
		(int)ptm->tm_hour, (int)ptm->tm_min, (int)ptm->tm_sec);
	return move(std::string(date));
}

// 计时器
void Timer()
{
	auto start = std::chrono::system_clock::now();
	auto end = std::chrono::system_clock::now();
	std::cout << "直接调用耗时:\t\t" << std::chrono::duration<double>(end - start).count() << "秒" << std::endl;
	//auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
	//cout << "花费了" << double(duration.count()) * std::chrono::microseconds::period::num / std::chrono::microseconds::period::den << "秒" << endl;
}

int main()
{
	std::shared_ptr<ClassA> pClassA = std::make_shared<ClassA>(1);
	std::shared_ptr<ClassB> pClassB = std::make_shared<ClassB>(1, 10);
	cout << "两个数之和: " << pClassB->Add(4, 1, 2, 3, 4) << endl;
	return 0;
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值