gpt4 book ai didi

factory - D 与工厂混合

转载 作者:行者123 更新时间:2023-12-02 06:20:24 25 4
gpt4 key购买 nike

考虑我有以下类(class):

/// File classes.d
class C {
string type() { return "C"; };
}

class C1 : C {
override string type() { return "C1"; };
}

class C2 : C {
override string type() { return "C1"; };
}

现在我想在其他地方实现一个工厂,比如:

/// File factory.d
module factory;
import std.functional;
import std.stdio;

void main() {
mixin(import("classes.d"));
auto c = cast(typeof(mixin("C1"))) Object.factory("C1");
writeln(c.type());
}

编译器 (dmd 2.058) 告诉我:

factory.d(7): Error argument C1 to typeof is not an expression

我知道以下行可以很好地编译:

auto c = cast(C1) Object.factory("classes.C1");

但这需要我在编译时知道类型 (C1)。我想在运行时获取类型(如字符串)。

最佳答案

mixin(`auto c = cast(typeof(C1)) Object.factory("C1");`)

我不明白你的问题,我认为:您想在运行时动态转换为给定类型吗?这在静态类型语言中是不可能的!你可以做的是,将你的类(或其他)作为 void* 传递并使用 switch ... case 将其转换为所需的类型(你也可以使用 std.variant ,这可能是更好的方法,但我从未使用过它)然后调用不同的函数(模板函数):

final switch(which_type) {
case "C1": foo(cast(C1)bar); break;
case "C2": foo(cast(C2)bar); break;
}

void foo(T)(T a) {
}

您还可以在编译时生成 switch case:

final switch(which_type) {
foreach(i; TypeTuple("C1", "C2")) {
case i: foo(mixin(`cast(` ~ i ~ `)bar`); break;
}
}

如果你只是想得到 typeof(bar).stringof 类型的字符串,将为你提供 bar 类型的字符串(但这在编译时已经知道时间)。

关于factory - D 与工厂混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11566698/

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