`
qiezi
  • 浏览: 497183 次
  • 性别: 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; 
     } 
} 

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

相关推荐

    D 语言详细教程

    - 泛型函数:D语言的模板功能允许编写泛型函数,实现代码复用。 - 泛型类:同样,也可以创建泛型类,通过类型参数实现不同类型的实例。 6. 并发与多线程 - 并发:D语言支持原生的并发模型,包括线程(thread)、...

    学习D语言的tango:第三章 D的面向对象特性

    类定义了对象的结构和行为,其中包含数据成员(属性)和成员函数(方法)。在D语言中,你可以使用`class`关键字来定义一个类。类可以拥有构造函数和析构函数,分别用于初始化和清理对象资源。此外,D语言支持私有...

    D语言教程

    - 函数是D语言的基本构建块,本章详细讲解了如何定义和调用函数。 - 模块则是组织代码的重要手段,可以将相关的函数和变量封装在一起。 #### 三、面向对象编程特性(Chapter 3:D’s Object-Oriented Features) ...

    (完整版)c++模板及应用习题答案.doc

    C++模板是C++语言中一个强大的特性,用于实现代码重用和泛型编程,它分为函数模板和类模板两种形式。泛型编程的核心在于参数化,即代码不依赖于特定的数据类型,而是通过参数来表示不同的数据类型,从而达到代码的...

    D语言程序设计(用D语言编程)

    D语言通过减少冗余代码、提供强大的模板支持以及内置的单元测试功能等方式提高了程序员的工作效率。 ##### 3. 函数 D语言中的函数可以具有默认参数、可变参数列表以及返回多个值的能力。此外,D语言还支持内联函数...

    C++语言考试题试卷 练习题 模拟题 选择题 含答案 考卷5.doc

    10. 在函数模板定义中,不正确的是F是一个返回Q类型的值,而return中用返回类型作为返回值错误。 11. 假设ClassY:public X,即类Y是类X的派生类,则说明一个Y类的对象时和删除Y类对象时,调用构造函数和析构函数的...

    D语言编程参考手册1.0

    - **模板扩展**:D语言的模板系统相较于C++进行了大幅增强,支持更为复杂的模板元编程。 - **高级特性**:支持契约式编程、内嵌汇编、内置单元测试、混合多继承风格、高级包管理机制等。 - **并行处理**:内置了同步...

    C++语言程序设计第九章PPT教学课件.pptx

    在使用函数模板时,如`abs(n)`和`abs(d)`,编译器会根据实参类型(这里是`int`和`double`)推断出`T`的具体类型,并生成相应的函数实例,即`int abs(int x)`和`double abs(double x)`。 **类模板**则扩展了这一概念...

    C++语言程序设计第九章PPT学习教案.pptx

    C++语言程序设计的第九章主要讲解了模板这一核心概念,包括函数模板和类模板。 首先,函数模板是C++中实现泛型编程的关键工具,它允许开发者编写能够处理多种数据类型的函数。函数模板的声明通常以`template ...

    面向对象程序设计04C++模板 .ppt

    类模板定义了一组通用的类,其中的成员变量和成员函数可以接受类型参数。例如,我们可以创建一个模板类`A`: ```cpp template class A { T x; public: A(T xx): x(xx) {} T fn() { return x * x * x; } }; ``` ...

    D语言材料

    模板是D语言强大的泛型编程工具,允许创建参数化的类型和函数。 ##### Mixin Mixin是一种代码内联技术,用于扩展类型或函数,常用于代码生成和元编程。 ##### 合约(Contracts) 合约定义了函数或方法的预条件、后置...

    C++模板实例代码(基础篇)

    `Array`类包含一些成员函数,如构造函数、析构函数、赋值运算符重载以及数组下标运算符重载等。构造函数允许用户指定数组的起始下标和结束下标,或者只指定数组长度。类中的`aptr`成员变量存储了动态分配的数组,`...

    C++语言程序设计复习题.docx

    以上是对C++语言程序设计中涉及的重要知识点的详细解释,涵盖了面向对象编程的基本概念、类的构造与析构、函数模板、继承、多态、封装、访问控制以及运算符重载等方面的内容。这些知识点是理解C++编程的基础,对于...

    许昌学院C++期末复习题.docx

    选项D正确,因为函数模板并不是一个实例函数,而是用于生成实例的蓝图。 6. 标准数据流对象:C++标准库提供了四个预定义的流对象,包括`cout`(标准输出)、`cin`(标准输入)、`cerr`(错误输出,不缓冲)和`clog`...

    许昌学院C++期末复习题.pdf

    以上就是C++相关的知识点详解,涵盖了内联函数、成员函数的访问、继承的访问控制、运算符重载、函数模板、标准流对象、函数模板调用、析构函数和构造函数的特性、派生类与基类的关系等概念。这些知识点都是C++编程...

    C++(普通).docx

    9. **成员函数指针**:成员函数指针是指向类成员函数的指针,可以用来调用特定对象的成员函数。 10. **关键字`class`**:在C++中,`class`是用于定义类的关键字。 11. **拷贝构造函数**:拷贝构造函数通常接收一个...

    2-C++语言1

    C++是一种高级编程语言,它是对C语言的扩展,不仅保留了C的语法特性,还引入了许多新的概念,如封装、继承、多态和模板。这些特性使得C++成为一种面向对象的编程语言,能够更好地支持复杂软件设计和提高代码的可重用...

    浙江大学《C++》九套期末模式复习题(含答案).pdf

    在派生类中调用基类成员函数时,应使用基类名和作用域解析运算符(::)来调用基类的成员函数(C)。在C++中,派生类对象可以调用基类的public成员函数,但是必须明确指出是基类的作用域。 9. 虚析构函数和多态 当...

Global site tag (gtag.js) - Google Analytics