C++可变参数模板实现输出

C++11 tuple&可变参数模板

 template

 void Print(T value)

 {

     std::cout << value << std::endl;

 }

 template

 void Print(Head head, Rail... rail)

 {

     std::cout << head << ", ";

     Print(rail...);

 }

 int main(int argc, _TCHAR* argv[])

 {

     Print();

     Print("hello", );

     Print(, "hello");

     Print(, "hello", 'H');

     getchar();

     return ;

 }

在上面的代码中,我们先定义了一个只有一个模板参数的函数模板,它简单地输出传入的参数的值。然后又定义了一个可变参数的函数模板,它输出第一个参数的 值,然后递归地调用自己。注意rail...这种写法,它表示将函数参数包分割成一个一个的参数,并传入Print中。这样,函数参数包中的第一个参数传 递给head,剩余的参数又重新构成一个函数参数包传递给rail。当递归调用到函数参数包中只有一个参数时,则会调用只有一个模板参数的Print函 数。

理解了可变模板参数的使用原理后,我们再来编写一个自己的Printf函数。

 void MyPrint(const char * pszText)

 {

     ASSERT(pszText != nullptr);

     std::cout << pszText;

 }

 template

 void MyPrint(const char * pszText, T value, Args... args)

 {

     assert(pszText != nullptr);

     while (*pszText)

     {

         if (*pszText == '%' && *++pszText != '%')

         {

             std::cout << value;

             MyPrint(++pszText, args...);

             return;

         }

         std::cout << *pszText++;

     }

 }

 int _tmain(int argc, _TCHAR* argv[])

 {

     MyPrint(nullptr);

     MyPrint("hello");

     getchar();

     return ;

 }

上述代码实现的功能针对可变参数模板的应用,当然不会像printf函数那么健壮,MyPrint识别格式化参数的标志就是%+下一位字符,如果条件满足的话就从Args参数中获取参数包分割后的第一个参数

上一篇:FJOI2018 部分题解


下一篇:Web前端面试题目汇总