2

我最近开始使用 Tango 库学习 D 版本 1。我决定编写一个小类Dout来包装tango.io.Stdout,但它会覆盖opShl以更好地匹配 C++ 的<<样式输出。我的实现是这样的:

// dout.d
module do.Dout;

import tango.io.Stdout;

class Dout
{
    public static Dout opShl(T) (T arg)
    {
        stdout(arg);
        return new Dout;
    }

    public static Dout newline()
    {
        stdout.newline;
        return new Dout;
    }
}

总的来说,我对 Dout.opShl() 做了一个简单的调用,就像这样。

// main.d
import do.Dout;
import tango.io.Console;

int main(char[][] argv)
{
    Dout << "Hello" << " world!" << Dout.newline;
    Cin.get();
    return 0;
}

这可行,但在按下回车键并退出 main 后,会打印文本“do.Dout.Dout”。单步执行代码后,我发现在汇编指令处打印了这段文字:

00406B5C call __moduleDtor (40626Ch)

其中 do.Dout 的析构函数被调用。

我的问题是,为什么在退出 main 时会打印模块名称,我能做些什么来阻止这种行为?

4

1 回答 1

3

打印“do.Dout.Dout”的原因是Dout << Dout.newline;打印一个新行(在newline属性调用中),然后尝试打印一个人类可读的Dout对象字符串(在它传递给之后opShl!Dout()

并且您只在销毁期间看到它,因为然后输出被刷新;)

你应该做的

__gshared Doutclass Dout = new Doutclass;

class Doutclass
{
    public Dout opShl(T) (T arg)
    {
        static if(T == NLine){
            stdout.newline;//if nl is passed do newline
        }else{
            stdout(arg);
        }
        return this;
    }

    struct NLine{}//this might need a dummy field to stop compiler complaints
    public static NLine newline()
    {
        return NLine();
    }
}

更接近 C 风格(Dout 是一个全局对象,每次调用都不会重新创建,换行符是一个特殊的结构,除了添加换行符之外还刷新输出)

于 2012-01-12T21:58:38.420 回答