不定参数模板,顾名思义。
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;
}
运行结果: