• metaprogramming笔记


    动态多态与静态多态

    动态多态:允许我们通过单个基类指针或引用处理多个派生类型的对象. 模板元编程中强调静态多态,允许不同类型的对象以同样的方式被操纵,只要它们支持某种共通的语法即可.

    动态多态,连同"延迟绑定"或"运行期派发",是面向对象程序的关键特性.静态多态(也称参数化多态),是泛型编程的本质要素.

    在面向对象的编程文献中将一个带有大量成员的类称作blob.类的成员彼此"耦合",因为它们必须被声明在一起.为了避免耦合并提高模块化程度,应该避免使用这种反模式.替代

    方式是采用独立的元函数来定义单独的traits

    元数据:可以被C++编译期系统操纵的"值"可以被认为是元数据.在模板元编程中,两种最常见的数据是类型和整数(包括bool)常量. C++的编译期部分通常被称为"纯函数式语言"

    ,因为元数据是可变的并且元函数不可以有任何副作用.

    多态:由于C++模板并非生来就多态地处理不同种类的元数据,因此MPL遵从使用type wrapper来包装非类型元数据的约定.尤其是,数值型元数据被表示为一个类型,该类型具有一个名为::value的

    嵌套数值常量成员

      元函数

      数值型元函数

      无参元函数:一般是作为元函数特化,解决基础数据类型的问题

      Traits:一种通过类模板特化在小片元数据之间建立关联的技术. Traits惯用法的一个关键特性是它是非侵入性的:我们可以在不修改被关联项自身的前提下,建立一个新的映射.MPL元函数可以看做

    traits的一个特例,它们对于任何输入都只有一个结果值.

    变长模板:

      一般讲的都是变长类型模板参数,这里是一个变长非类型模板参数的例子,基本办法还是一样的,就是取出一个,然后不断特化,直到最后剩一个模板参数

    #include<cstdio>
    template<int...A>  struct container{
        void display(){printf("YIKES
    ");}
    };
    
    template<int B, int ...C> struct container<B, C...>{
        void display(){
            printf("spec %d
    ", B);
            container<C...> test;
            test.display();
        }
    };
    
    template<int C> struct container<C>{
        void display(){
            printf("spec %d
    ", C);
        }
    };
    
  • 相关阅读:
    围棋角部大眼的气
    openwrt 增加自定义包
    OpenWrt – 编译前的./scripts/feeds脚本用法
    memset 赋初值为无穷大和无穷小
    android 自动点击学习课程
    最多硬币问题
    最少硬币问题
    9.2 嵌套矩形问题
    ajax请求到一个controller在跳转到下载的controller上也不能下载,百度了一下总结下原因:发现原来jQuery的ajax回调已经把response的数据傻瓜式的以字符串的方式解析.
    MySQL 数据库的远程访问权限
  • 原文地址:https://www.cnblogs.com/hustxujinkang/p/4982445.html
Copyright © 2020-2023  润新知