在看同事编写的代码,发现有如下的代码,因为没用过,所以查了一下这是什么语法,通过查询资料知道了这是C++11中增加的可变参数模板。
template<class T, class ...Args>
bool GetValue(T &value, Args &&...args) const;
template<class T, class ...Args>
static bool GetValue(T &value, const nlohmann::json &jsData, Args &&...args);
C++11以前,类模板和函数模板只能含有固定数量的模板参数,虽然类型灵活了但是个数不灵活,不够完美,可变参数模板允许模板定义中包含0到任意个模板参数,解决以前模板参数个数不灵活的的缺陷。
1.可变参数模板写法
情况一:完全泛化
template<typename... Types>
或者
template<class ...Args>
情况二:部分泛化
template<typename T, typename... Types>
或者
template<class T, class ...Args>
2.可变参数模板使用
2.1 函数模板的使用
举例一:
#include <iostream>
#include <string>
using namespace std;
void MyPrint() {}
template<class T, class... Args>
void MyPrint(const T& firstArg, const Args&... args) {
std::cout << firstArg << " " << sizeof...(args) << std::endl;
MyPrint(args...);
}
int main()
{
MyPrint(111, 222, 333, 444, 555, 666);
return 0;
}
运行结果:
举例二:找出一堆数中最小的一个
#include <iostream>
template <typename T>
T MyMin(T value) {
return value;
}
template <typename T, typename... Types>
T MyMin(T value, Types... args) {
return std::min(value, MyMin(args...));
}
int main(int argc, char *argv[]) {
std::cout << MyMin(56, 23, 5, 17, 678, 9) << std::endl;
return 0;
}
运行结果如下:
2.2 类模板使用
举例:
#include <iostream>
template<typename... Values> class MyTuple;
template<> class MyTuple<> {};
template<typename Head, typename... Tail>
class MyTuple<Head, Tail...>
: private MyTuple<Tail...>
{
typedef MyTuple<Tail...> inherited;
public:
MyTuple() {}
MyTuple(Head v, Tail... vtail) : m_head(v), inherited(vtail...) {}
Head& head() {return m_head;}
inherited& tail() {return *this;}
protected:
Head m_head;
};
int main(int argc, char *argv[]) {
MyTuple<char, int, float, std::string> t('A', 888, 3.1415926, "hello world");
std::cout << t.head() << " " << t.tail().head() << " " << t.tail().tail().head() <<
" " << t.tail().tail().tail().head() << std::endl;
return 0;
}
运行结果如下: