如何在类中使用std.functional.memoize?

如何在类中使用std.functional.memoize?,d,D,我不知道如何在类中使用memoize函数 import std.functional; class A { int slowFunc(int a, int b) { return 0; } alias memoize!slowFunc fastFunc; } void main() { auto a = new A; a.fastFunc(1,2); } 尝试编译时出现错误:错误:需要“This”访问成员slowFunc 我该怎么做

我不知道如何在类中使用memoize函数

import std.functional;

class A {
    int slowFunc(int a, int b) {
        return 0;
    }

    alias memoize!slowFunc fastFunc;
}

void main() {
    auto a = new A;
    a.fastFunc(1,2);
}
尝试编译时出现错误:错误:需要“This”访问成员slowFunc


我该怎么做才能让它工作呢?

它实际上还不支持这一点。我们可以提出一个增强请求。以下是我的实验实现:

import std.stdio;
import std.traits;
import std.typecons;
import std.datetime;

template isClassStruct(alias fun)
{
    enum bool isClassStruct = (is(fun == class) || is(fun == struct));
}

mixin template memoize(alias fun, uint maxSize = uint.max)
    if (isClassStruct!(__traits(parent, fun)))
{
    ReturnType!fun opCall(ParameterTypeTuple!fun args)
    {
        static ReturnType!fun[Tuple!(typeof(args))] memo;
        auto t = tuple(args);
        auto p = t in memo;
        if (p) return *p;
        static if (maxSize != uint.max)
        {
            if (memo.length >= maxSize) memo = null;
        }

        mixin("auto r = this." ~ __traits(identifier, fun) ~ "(args);");
        memo[t] = r;
        return r;
    }    
}

class A 
{
    int slowFunc(int a, int b) 
    { 
        int result;
        foreach (_; 0 .. 1024)
        {
            result += a;
            result += b;
        }
        return result;
    }

    mixin memoize!slowFunc fastFunc;
}

enum CallCount = 2048;

void main() 
{
    A a = new A;

    auto sw1 = StopWatch(AutoStart.yes);
    foreach (x; 0 .. CallCount)
    {
        a.slowFunc(100, 100);  // 11232 usecs
    }
    sw1.stop();
    writeln(sw1.peek.usecs);

    auto sw2 = StopWatch(AutoStart.yes);
    foreach (x; 0 .. CallCount)
    {
        a.fastFunc(100, 100);  // 302 usecs
    }
    sw2.stop();
    writeln(sw2.peek.usecs);
}

时间注释当然是针对我的机器的。:)

别名记忆!(这是slowFunc)fastFunc?编译时仍会出现相同的错误。顺便说一句,这在语义上是不安全的。方法需要
this
引用,因为它们通常必须查找内部类状态(例如类字段)。如果在两次调用之间状态发生变化,哈希结果将不会更新,并且您将返回过时的结果。但是可能有一些合法的记忆用例(我想到了@pure方法)。增强字段为:虽然有一种清除内部哈希的方法,但是您必须对每个调用进行布尔检查。非常感谢你,特别是你的再次光临。那会创造奇迹的!:)顺便说一句,我用了错误的措辞。应该调用Rehash
clear
,因为它会清除散列。