• C++11中可变参数模板使用


    在看同事编写的代码,发现有如下的代码,因为没用过,所以查了一下这是什么语法,通过查询资料知道了这是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到任意个模板参数,解决以前模板参数个数不灵活的的缺陷。

    1.可变参数模板写法

    情况一:完全泛化

    template

    或者
    template

    情况二:部分泛化

    template

    或者
    template

    2.可变参数模板使用

    2.1 函数模板的使用

    举例一:

    1. #include
    2. #include
    3. using namespace std;
    4. void MyPrint() {}
    5. template<class T, class... Args>
    6. void MyPrint(const T& firstArg, const Args&... args) {
    7. std::cout << firstArg << " " << sizeof...(args) << std::endl;
    8. MyPrint(args...);
    9. }
    10. int main()
    11. {
    12. MyPrint(111, 222, 333, 444, 555, 666);
    13. return 0;
    14. }

    运行结果:

     

    举例二:找出一堆数中最小的一个

    1. #include
    2. template <typename T>
    3. T MyMin(T value) {
    4. return value;
    5. }
    6. template <typename T, typename... Types>
    7. T MyMin(T value, Types... args) {
    8. return std::min(value, MyMin(args...));
    9. }
    10. int main(int argc, char *argv[]) {
    11. std::cout << MyMin(56, 23, 5, 17, 678, 9) << std::endl;
    12. return 0;
    13. }

    运行结果如下:

     

    2.2 类模板使用

    举例:

    1. #include
    2. template<typename... Values> class MyTuple;
    3. template<> class MyTuple<> {};
    4. template<typename Head, typename... Tail>
    5. class MyTuple
    6. : private MyTuple
    7. {
    8. typedef MyTuple inherited;
    9. public:
    10. MyTuple() {}
    11. MyTuple(Head v, Tail... vtail) : m_head(v), inherited(vtail...) {}
    12. Head& head() {return m_head;}
    13. inherited& tail() {return *this;}
    14. protected:
    15. Head m_head;
    16. };
    17. int main(int argc, char *argv[]) {
    18. MyTuple<char, int, float, std::string> t('A', 888, 3.1415926, "hello world");
    19. std::cout << t.head() << " " << t.tail().head() << " " << t.tail().tail().head() <<
    20. " " << t.tail().tail().tail().head() << std::endl;
    21. return 0;
    22. }

    运行结果如下:

     

  • 相关阅读:
    Vue-router
    hive中使用iceberg表格式时锁表总结
    JS for...in 和 for...of 的区别?
    Pascal面试考试题库和答案(命令式和过程式编程语言学习资料)
    Spring IOC源码:registerBeanPostProcessors 详解
    springboot和springcloud 和springcloud Alibaba的版本选择
    基于注解实现缓存的框架 -- SpringCache
    瑞吉外卖优化
    10月技术主题推荐丨Serverless on Azure
    os模块介绍
  • 原文地址:https://blog.csdn.net/hsy12342611/article/details/128176124