我知道模板像返回动态类型
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是一种静态类型语言。 所有类型必须在编译时已知。所以,不,你不能做你想做的事情。
现在,您可以使用inheritance,unions或std.variant.Variant来获得一种动态类型的形式,但不像您想要做的那样。这只适用于动态语言。
利用类,一类引用可以指向一个派生类的实例,而不是基类的引用是,这样你就可以得到多态/动态行为,但基类的类型在编译时已知,以及任何参考所指的必须是是派生类型,因此必须是类。
随着工会,你可以有一个变量,它可以使用相同的内存不同类型(所以它一次只能是一种类型),但它通常被认为是一个相当低层次的构造,并且最好避免并不需要它。工会不会跟踪其当前类型,因此如果它可能是int
和string
,它很容易持有int
,但将其用作string
(反之亦然),从而导致讨厌的错误。
随着Variant
(这可能是你想使用的),你可以有一个变量可以容纳不同的类型 - 类似于联合 - 但你不指定它可以容纳的类型(不像联合),并且它实际上会跟踪它目前所持有的类型(与union不同),因此使用起来更安全。
很好的答案,但恕我直言变体(尤其是在工作中的新的一个)基本上是一个动态的输入在D的实现。 – dsimcha
谢谢std.variant解决我的问题谢谢 – bioinfornatics
@dsimcha是的,'Variant'实质上是试图实现动态在静态类型之上打字,但动态类型不是真的被语言本身支持。 –
你打算用它做什么? – GManNickG