2011-11-01 107 views
3

我知道模板像返回动态类型

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"); 
} 

我不知道我是否可以投反对票并改变原型。

感谢所有

+1

你打算用它做什么? – GManNickG

回答

8

d,如C,C++,C#和Java是一种静态类型语言。 所有类型必须在编译时已知。所以,不,你不能做你想做的事情。

现在,您可以使用inheritance,unionsstd.variant.Variant来获得一种动态类型的形式,但不像您想要做的那样。这只适用于动态语言。

  • 利用类,一类引用可以指向一个派生类的实例,而不是基类的引用是,这样你就可以得到多态/动态行为,但基类的类型在编译时已知,以及任何参考所指的必须是是派生类型,因此必须是类。

  • 随着工会,你可以有一个变量,它可以使用相同的内存不同类型(所以它一次只能是一种类型),但它通常被认为是一个相当低层次的构造,并且最好避免并不需要它。工会不会跟踪其当前类型,因此如果它可能是intstring,它很容易持有int,但将其用作string(反之亦然),从而导致讨厌的错误。

  • 随着Variant(这可能是你想使用的),你可以有一个变量可以容纳不同的类型 - 类似于联合 - 但你不指定它可以容纳的类型(不像联合),并且它实际上会跟踪它目前所持有的类型(与union不同),因此使用起来更安全。

+1

很好的答案,但恕我直言变体(尤其是在工作中的新的一个)基本上是一个动态的输入在D的实现。 – dsimcha

+0

谢谢std.variant解决我的问题谢谢 – bioinfornatics

+0

@dsimcha是的,'Variant'实质上是试图实现动态在静态类型之上打字,但动态类型不是真的被语言本身支持。 –