欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++ 可变参函数模板 可变参类模板 模板模板参数

程序员文章站 2024-03-14 11:10:40
...

一、可变参函数模板 

template.h

#pragma once
#include <iostream>
#include <map>

void myfunct2()
{
	std::cout << "终止调用" << std::endl;
}
template <typename T, typename...U>
void myfunct2(const T& firstarg, const U&... otherargs)
{
	std::cout << "收到的参数值是:" << firstarg << std::endl;
	myfunct2(otherargs...);
}

main.cpp

#include <iostream>
#include "template.h"
using namespace std;
 
int main()
{
    myfunct2(10, "abc", 12.7);
}

输出:

收到的参数值是:10
收到的参数值是:abc
收到的参数值是:12.7
终止调用

 

二、可变参类模板

template.h

#pragma once
#include <iostream>
#include <map>

template <typename... Args> class myclasst {};
template <typename First, typename... Others>
class myclasst<First, Others...> :private myclasst<Others...>
{
public:
	myclasst() 
	{
		std::cout << "执行了 this:%p" << this << std::endl;
	}
	myclasst(First parf, Others... paro) : m_i(parf), myclasst<Others...>(paro...)
	{
		std::cout << "---------begin---------------" << this << std::endl;
		std::cout << "执行了 this:%p" << this << std::endl;
		std::cout << "m_i:" << m_i << std::endl;
		std::cout << "---------end---------------" << this << std::endl;
	}
	First m_i;
};

template<>
class myclasst<>
{
public:
	myclasst()
	{
		std::cout << "执行了最上层this:%p" << this << std::endl;
	}
};

main.cpp

#include <iostream>
#include "template.h"
using namespace std;
 
int main()
{
    myclasst<int, float, double> myc(12, 13.4F, 56);
}

输出:

执行了最上层this:%p003BFC30
---------begin---------------003BFC30
执行了 this:%p003BFC30
m_i:56
---------end---------------003BFC30
---------begin---------------003BFC30
执行了 this:%p003BFC30
m_i:13.4
---------end---------------003BFC30
---------begin---------------003BFC30
执行了 this:%p003BFC30
m_i:12
---------end---------------003BFC30

C++ 可变参函数模板 可变参类模板 模板模板参数

 

三、模板模板参数

template.h

#pragma once
#include <iostream>
#include <map>

template <typename T, 
	template<class> class Container
	//template<typename W> typename Container
	>
class myclass
{
public:
	T m_i;
	Container<T> myc;

	myclass()
	{
		for (int i = 0; i < 10; i++)
		{
			myc.push_back(i);
		}
	}
};

main.cpp

#include <iostream>
#include "template.h"
using namespace std;

template<typename T>
using MYVec = vector<T, allocator<T>>;

int main()
{
    myclass<int, MYVec> myvecObj;
}

Container也是个模板。由于是个参数,所以为模板模板参数。

相关标签: C++语言