我知道模板喜欢
T add(T)(T a, Tb){
return a + b;
}
但这需要用户询问将返回哪种类型,我想在方法内部计算将返回哪种类型,如:
T getField( size_t column ){
if( column == 0 )
T = int;
else
T = string;
return to!T("1");
}
我不知道我是否可以转换为对象并更改原型。
谢谢大家
我知道模板喜欢
T add(T)(T a, Tb){
return a + b;
}
但这需要用户询问将返回哪种类型,我想在方法内部计算将返回哪种类型,如:
T getField( size_t column ){
if( column == 0 )
T = int;
else
T = string;
return to!T("1");
}
我不知道我是否可以转换为对象并更改原型。
谢谢大家
D 与 C、C++、C# 和 Java 一样,是一种静态类型语言。所有类型必须在编译时已知。所以,不,你不能做你想做的事。
现在,您可以使用继承、联合或std.variant.Variant来获得一种动态类型,但与您尝试做的不太一样。这只适用于动态语言。
对于类,类引用可以指向派生类的实例而不是引用所针对的基类,因此您可以获得多态/动态行为,但基类的类型在编译时是已知的,并且任何东西引用所指的必须是派生类型,因此必须是类。
使用联合,您可以拥有一个变量,该变量可以使用相同的内存保存不同的类型(因此一次只能是一种类型),但它通常被认为是一种相当低级的构造,如果您真的不需要,最好避免使用它。union 不会跟踪它当前的类型是什么,所以如果它既可以是 anint
又是 a string
,它很容易持有 an int
,但是你将它用作 a string
(反之亦然),从而导致讨厌的错误。
使用Variant
(这可能是您想要使用的),您可以拥有一个可以保存不同类型的变量 - 类似于联合 - 但您没有指定它可以保存哪些类型(与联合不同),它实际上保持跟踪它当前拥有的类型(与联合不同),因此使用起来更安全。