`
qiezi
  • 浏览: 491503 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

D语言的成员函数模板

    博客分类:
  • D
阅读更多
DMD 0.166 特性列表中有一条:
    * ncorporated Oskar Linde's patches to support member templates.

当时没注意,今天看到邮件列表中的一个帖子。才发现已经支持成员函数模板了,不过是不是在0.166中支持的就不清楚了。

没有成员函数模板的模板是不完整的。一个简单的例子,源于我的另一篇“泛型矩阵类”:

class Matrix(T, int R, int C){
    static assert(R > 0 && C > 0);

    Matrix!(T, R, C1) opMul(int C1)(Matrix!(T,C,C1) rhs){
        return null;
    }
}


int main()
{
    {
        Matrix!(int, 3, 4) m1;

        Matrix!(int,4,3) m2;
        // 维度匹配,可以相乘
        Matrix!(int, 3, 3) m3 = m1.opMul!(3)(m2);

        Matrix!(int, 8, 3) m4;
        // 维度不匹配,无法相乘
        //auto m5 = m1 * m4;
        // 维度匹配,可以相乘
        Matrix!(int, 8, 4) m5 = m4.opMul!(4)(m1);
    }
    return 0;
}


[注:仅演示类型匹配特性]

可见模板在处理强类型方面的作用。不过目前为止似乎还没有办法实现“成员函数模板参数类型自动推导”,一个小小的遗憾,否则上面的测试代码可以修改为:

int main()
{
    {
        Matrix!(int, 3, 4) m1;

        Matrix!(int,4,3) m2;
        // 维度匹配,可以相乘
        Matrix!(int, 3, 3) m3 = m1 * m2;

        Matrix!(int, 8, 3) m4;
        // 维度不匹配,无法相乘
        //auto m5 = m1 * m4;
        // 维度匹配,可以相乘
        Matrix!(int, 8, 4) m5 = m4 * m1;
    }
    return 0;
}


C++模板早已实现了这个特性。
分享到:
评论
3 楼 qiezi 2007-01-07  
不是不支持,是不完善,以后应该会改进吧。
2 楼 taowen 2007-01-05  
类型推倒不支持?那constraint就更不支持喽?这模板也太弱了吧……
1 楼 qiezi 2006-12-05  
在邮件列表中找到一个方法:
class Matrix(T, int R, int C){ 
     static assert(R > 0 && C > 0); 
     const r = R; 
     const c = C; 

     Matrix!(T,R,M.c) opMul(M)(M rhs){ 
         static assert(C == M.r, 
                       "Matrix inner dimensions must agree for *"); 
         return null; 
     } 
} 

权宜之计,不得已而用之,期望以后能完善“模板参数类型隐式推导”。

相关推荐

    c++复习题(考试专用)

    类的定义格式分为说明部分和实现部分 类中一般包含有成员函数和数据成员 类中成员有3种访问权限 成员函数都是公有的,数据成员都是私有的 ~D 关于类中成员函数的描述中,错误的是( )。...

    C++大学教程,一本适合初学者的入门教材(part1)

    11.4.3 istream类中的其他成员函数(Peek、Putback和ignore) 11.4.4 类型安全的I/0 11.5 成员函数read、gcount和write的无格式输人/输出 11.6 流操纵算子 11.6.1 整数流的基数:流操纵算子dec、oct、hex和...

    面向对象与C++试题.doc

    类的成员函数 D.以上都不对 16、如果一个类至少有一个纯虚函数,那么就称该类为( )。 A.抽象类 B.派生类 C.纯基类 D.以上都不对 17、下面关于友元的描述中,错误的是( )。 A.友元函数可以访问该类的私有...

    CUDA编程指南5.0

    第一章导论 1 1.1 从图形处理到通用并行计算 1 1.2 CUDATM:一种通用并行计算架构 3 1.3 一种可扩展的编程模型 3 1.4 文档结构 4 第二章编程模型 7 2.1 内核 7 2.2 线程层次 8 2.3 存储器层次 11 ...

    C++大学教程,一本适合初学者的入门教材(part2)

    11.4.3 istream类中的其他成员函数(Peek、Putback和ignore) 11.4.4 类型安全的I/0 11.5 成员函数read、gcount和write的无格式输人/输出 11.6 流操纵算子 11.6.1 整数流的基数:流操纵算子dec、oct、hex和...

    零起点学通C++多媒体范例教学代码

    6.6 成员函数的声明和定义 6.7 内联函数 6.7.1 普通内联函数 6.7.2 内联成员函数 6.8 头文件与源文件 6.9 const成员函数 6.10构造函数 6.11默认构造函数 6.12析构函数 6.13析构对象数组 6.14总结 第7章 循环语句 ...

    零起点学通C++学习_多媒体范例教学代码

    13.9.1 在虚函数中调用成员函数 13.9.2 3种调用虚函数的方式比较 13.10被继承的虚函数仍然是虚函数 13.11系统是如何调用虚函数的 13.12在虚函数中使用成员名限定 13.13虚析构函数 13.14总结 第14章 数组 ...

    stribog:D 编程语言的小型实用程序集合

    斯特里博格 这是一个集合库,其中包含我...模板罗宾函数 foreach 展开的编译时间 聚合成员自省 编译时稳定排序 - 具有编译时代码生成的特定容器: 多键映射 - 操作类似于 Boost MPL 映射,您可以定义多个键值类型对。

    lexyaccmingw

    ) 下面是整个项目的文档目录: <br> * 自动化C++程序设计 * 基础篇 * C++里的模板语言 * 静态诊断 * 为什么说模版是C++的子语言 * 静态数学运算 * 静态选择结构 * 静态循环结构...

    C++程序设计彻底研究(是code不是书)

    21.3 使用成员函数重载二元运算符 21.4 使用friend函数重载二元运算符 21.5 重载一元运算符 21.6 含有指针数据成员的类 21.7 等效阻抗的计算 21.8 常犯的错误 21.9 本章重点 21.10 本章练习 第22章 面向对象...

    深入解析ATL(第2版).pdf

    A.5 成员函数模板 A.6 总结 附录B ATL头文件 附录C 移植到ATL 8 C.1 字符串、字符集和转换 C.2 与MFC共享的类 C.3 实现COM服务器 C.4 ActiveX控件和控件容纳 C.5 ATL_MIN_CRT变化 C.6 总结 附录D 属性化ATL D.1 ATL ...

    数据结构与算法分析

     1.6.1 函数模板   1.6.2 类模板   1.6.3 Object、Comparable和例子   1.6.4 函数对象   1.6.5 类模板的分离编译   1.7 使用矩阵   1.7.1 数据成员、构造函数和基本访问函数   1.7.2 ...

    数据结构(C++)有关练习题

    e. 如有可能,请建立一个存储商品名称和数量的文本文件,并为二叉搜索树建立一个成员函数SetupInventory(),用于从该文本文件中读取库存商品的数据, 实验报告要求: 1、 按要求记录下二叉搜索树的完整实验...

    C++MFC教程

    在MFC中对消息的处理利用了消息映射的方法,该方法的基础是宏定义实现,通过宏定义将消息分派到不同的成员函数进行处理。下面简单讲述一下这种方法的实现方法: 代码如下 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd...

    超级有影响力霸气的Java面试题大全文档

    多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 5、String是最基本的数据类型吗?  基本数据类型包括byte、int、char、long、float、double、boolean和short。  java....

Global site tag (gtag.js) - Google Analytics