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
三、模板模板参数
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也是个模板。由于是个参数,所以为模板模板参数。