gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:01:39 25 4
gpt4 key购买 nike

我无法弄清楚如何在类中使用 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);
}

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

关于d - 我如何在类中使用 std.functional.memoize ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12677498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com