在看同事编写的代码,发现有如下的代码,因为没用过,所以查了一下这是什么语法,通过查询资料知道了这是C++11中增加的可变参数模板。
template
bool GetValue(T &value, Args &&...args) const;
template
static bool GetValue(T &value, const nlohmann::json &jsData, Args &&...args);
C++11以前,类模板和函数模板只能含有固定数量的模板参数,虽然类型灵活了但是个数不灵活,不够完美,可变参数模板允许模板定义中包含0到任意个模板参数,解决以前模板参数个数不灵活的的缺陷。
情况一:完全泛化
template
或者
template
情况二:部分泛化
template
或者
template
举例一:
- #include
- #include
-
- 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
-
- 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;
- }
运行结果如下:
举例:
- #include
-
- template<typename... Values> class MyTuple;
- template<> class MyTuple<> {};
-
- template<typename Head, typename... Tail>
- class MyTuple
- : private MyTuple
- {
- typedef MyTuple
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;
- }
运行结果如下: