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

D语言的模板

    博客分类:
  • D
阅读更多
D语言的模板使用非常方便灵活,受够了C++模板编写之苦的同学们可以感受一下D语言的模板,下面先展示一个D语言编写的多分派委托类,在我的旧BLOG上曾经写过一个C++版本的,整个过程感觉非常痛苦。。。

闲话少说,请看代码:

import std.stdio;


template DelegateHandlers(HandlerType, FunctionType)
{
    HandlerType[] handlers;
    FunctionType[] functions;

    
void opAddAssign(HandlerType h)
    {
        handlers.length 
= handlers.length + 1;
        handlers[length
-1= h;
    }
    
void opAddAssign(FunctionType f)
    {
        functions.length 
= functions.length + 1;
        functions[length
-1= f;
    }
}

template Delegate(Ret)
{
    
class Delegate
    {
        alias Ret 
delegate () HandlerType;
        alias Ret function () FunctionType;
        mixin DelegateHandlers
!(HandlerType, FunctionType);

        
static if(is(Ret: void))
        {
            
void opCall ()
            {
                
foreach (HandlerType handler; handlers)
                    handler ();
                
foreach (FunctionType _function; functions)
                    _function ();
            }
        }
        
else
        {
            Ret opCall ()
            {
                Ret ret;
                
foreach (HandlerType handler; handlers)
                    ret 
= handler ();
                
foreach (FunctionType _function; functions)
                    ret 
= _function ();
                
return ret;
            }
        }

    }
}

template Delegate(Ret, Arg1)
{
    
class Delegate
    {
        alias Ret 
delegate (Arg1) HandlerType;
        alias Ret function (Arg1) FunctionType;
        mixin DelegateHandlers
!(HandlerType, FunctionType);

        
static if(is(Ret: void))
        {
            
void opCall (Arg1 a1)
            {
                
foreach (HandlerType handler; handlers)
                    handler (a1);
                
foreach (FunctionType _function; functions)
                    _function (a1);
            }
        }
        
else
        {
            Ret opCall (Arg1 a1)
            {
                Ret ret;
                
foreach (HandlerType handler; handlers)
                    ret 
= handler (a1);
                
foreach (FunctionType _function; functions)
                    ret 
= _function (a1);
                
return ret;
            }
        }

    }
}


class Test
{
    
void test ()
    {
        writefln (
"Test.test");
    }
    
int test1 ()
    {
        writefln (
"Test.test1");
        
return 1;
    }
    
void test2(int v)
    {
        writefln (
"Test.test2");
    }
    
int test3(int v)
    {
        writefln (
"Test.test3");
        
return 7;
    }
}

void test_func ()
{
    writefln (
"test_func");
}
int test_func1 ()
{
    writefln (
"test_func1");
    
return 2;
}
void test_func2(int v)
{
    writefln (
"test_func2");
}
int test_func3(int v)
{
    writefln (
"test_func3");
    
return 9;
}

void main()
{
    Test t 
= new Test;

    alias Delegate
!(void) DDD;
    DDD d 
= new DDD;
    d 
+= &t.test;
    d 
+= &test_func;

    d ();

    alias Delegate
!(int) DDD1;
    DDD1 d1 
= new DDD1;
    d1 
+= &t.test1;
    d1 
+= &test_func1;

    
int a = d1 ();
    assert (a 
== 2);

    alias Delegate
!(voidint) DDD2;
    DDD2 d2 
= new DDD2;
    d2 
+= &t.test2;
    d2 
+= &test_func2;

    d2 (
1);

    alias Delegate
!(intint) DDD3;
    DDD3 d3 
= new DDD3;
    d3 
+= &t.test3;
    d3 
+= &test_func3;

    
int b = d3 (2);
    assert (b 
== 9);
}

非常干净,非常简洁,不是吗?这个只花了我10分钟时间来写。。。

D语言的委托非常高效,有兴趣的可以测试一下通过委托和直接调用之间的性能差别。上面这个自己实现的多分派委托类,效率也非常高,我的测试结果是对于性能的影响几乎可以忽略。想起那个历尽千辛万苦实现的C++多分派委托类,实现复杂、调试费时、运行效率还很低,每每一想到这心里那个难受啊。。。。

再来看一下D语言强大的静态检查机制:

template XXX (int v)
{
    
int n = v;
    
static assert (v > 3);
}

void main ()
{
    
int n;
    n 
= XXX!(4).n; // OK
    n = XXX!(3).n; // 编译错误
}

同样很漂亮。

如果你觉得提示信息不够友好,可以修改为:

template XXX (int v)
{
    
int n = v;
    
static if (v <= 3)
        pragma (msg, 
"template value must > 3");
    
static assert (v > 3);
}

这是编译时的错误提示:

Compiling test.d ...
template value must > 3
D:\workspace\dace\test.d(94): static assert  (3 > 3) is false
D:\workspace\dace\test.d(173): template instance test.XXX!(3) error instantiating

我想以后有可能会扩充pragma,支持错误输出,这样就不用写重复的语句了,可以简化成这样:
template XXX (int v)
{
    
int n = v;
    
static if (v <= 3)
        pragma (error, 
"template value must > 3");
}

这样看起来更好。不过目前有很多重要特性要实现,这种玩意可能要很久以后才会加入了。
分享到:
评论

相关推荐

    D语言编程参考手册

    - **模板元编程**:深入探讨了D语言模板系统的高级特性,包括特例化、名称查询、模板递归等。 #### 七、D语言的内存管理和异常处理 - **内存管理**:详细阐述了D语言中的不同内存管理策略,如写时复制、实时内存...

    D语言中文文档 D语言中文文档

    2. **模板**:D语言的模板系统非常强大,可以用于创建泛型函数和泛型类型。模板能够帮助程序员编写高度通用的代码,减少重复工作,提高代码复用性。 3. **内存管理**:D语言具有自动垃圾回收机制,同时支持手动内存...

    D语言的中文文档

    3. **模板**:D语言的模板类似于C++的模板,允许创建泛型函数和类,实现代码重用,减少冗余。 4. **内存管理**:D语言提供了垃圾回收机制,自动管理内存,但同时也允许程序员直接控制内存,以满足对性能有高要求的...

    D语言特性及开发简介

    3. **模板系统**:D语言的模板系统比C++的更加强大和灵活,允许开发者创建更复杂的泛型代码。 4. **契约式设计**:通过断言和 invariant,D语言支持契约式编程,有助于确保代码的正确性。 5. **高级模板技术**:D...

    D语言操作Sqlite

    1. **D语言基础**:D语言由Walter Bright创建,具有C/C++语法的相似性,但提供了更多现代编程语言的特性,如垃圾回收、模板元编程、自动类型推断等。理解D语言的基本语法、数据类型、控制结构以及面向对象特性是开始...

    D 语言详细教程

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

    D语言环境解压包

    6. **元编程**:D语言的模板系统允许在编译时进行元编程,使得开发者可以在代码中编写代码,提高代码的灵活性和效率。 7. **性能**:由于D语言的编译器(如解压包中的DMD,D语言的官方编译器)优化能力强,生成的...

    d语言ide:poseidon

    **D语言IDE:Poseidon** D语言是一种现代的系统编程语言,它旨在融合了C#、Java、C++以及PHP和Python等动态语言的优势。D语言的独特之处在于它不依赖虚拟机,而是编译成可执行代码,这使得它在性能上具有显著优势。...

    D语言真相 The Case for D(1-5)

    由于可以直接生成机器码,D语言的程序执行速度快,而且它的模板元编程和内联函数等功能,允许在编译期进行计算,进一步提高了代码的运行效率。 此外,D语言还有强大的标准库,涵盖了字符串处理、网络编程、并发处理...

    D语言白皮书及语法(中文)

    D语言还引入了模板,这是一种泛型编程的机制,类似于C++的模板,但更为强大和灵活。它可以用于创建泛型函数和泛型类,允许编写一次代码并应用于多种数据类型,提高了代码的重用性。同时,D语言的模板具有元编程能力...

    编译时开发D语言

    D语言是一种现代化的系统编程语言,由沃斯·安德烈亚斯·施密特(Walter Bright)设计,旨在结合C和C++的优点并消除它们的一些缺点。它以其高效、安全和强大的元编程能力而受到程序员的青睐。在"编译时开发D语言"的...

    D语言编译器 D语言:新一代程序语言

    D语言的设计目标之一是提高编程效率,因此它提供了一些高级特性,如垃圾回收、类型推断、模板元编程以及自动并行化。这些特性使得开发者能够在编写高效代码的同时,减少许多常见的编程错误和繁琐的管理工作。 垃圾...

    D 语言编程中文参考手册

    D语言是一种现代、通用、面向对象的编程语言,它的设计目标是高效、灵活性高,并且具有C/C++的性能。D语言由Walter Bright在2001年创建,至今已发展到2.0版本,提供了许多现代编程语言的特性。本参考手册详细介绍了D...

    D语言编程手册上pdf

    ### D语言编程手册知识点梳理 #### 一、D语言概览 - **D语言起源与发展**:D语言是由Walter Bright设计的一种通用编程语言,旨在解决C++中存在的问题,并引入了现代语言的一些特性。该语言的目标是提高开发效率的...

    D语言规范_pdf和doc_[En].zip

    6. **模板**:D语言的模板允许泛型编程,不仅应用于类和函数,还可以用于接口和枚举,实现高度的代码复用。 7. **标准库**:D语言的标准库提供了大量实用的函数和数据结构,涵盖输入/输出、字符串处理、网络编程、...

    D语言教程

    - 元编程是指在编译时进行计算的能力,D语言的模板支持复杂的元编程技术。 - 通过示例展示了如何利用模板来实现高效且灵活的代码。 3. **类型推断与重载**: - 类型推断减少了显式指定类型的需要。 - 重载允许...

Global site tag (gtag.js) - Google Analytics