返回动态类型

时间:2011-11-01 20:33:14

标签: d variant dynamic-typing phobos

我知道像

这样的模板
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 个答案:

答案 0 :(得分:8)

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

现在,您可以使用inheritanceunionsstd.variant.Variant来获得动态类型,但不太像您尝试的那样。这只适用于动态语言。

  • 对于类,类引用可以指向派生类的实例而不是引用所针对的基类,因此您可以获得多态/动态行为,但基类的类型是已知的在编译时,引用引用的任何内容必须是派生类型,因此必须是类。

  • 对于联合,你可以有一个变量,它可以使用相同的内存保存不同的类型(因此它一次只能是一种类型),但它通常被认为是一个相当低级的构造,最好避免使用你真的不需要它。联合不会跟踪它当前的类型,所以如果它可以是intstring,那么它很容易持有int,但是你将它用作string(反之亦然),导致令人讨厌的错误。

  • 使用Variant(可能是您想要使用的),您可以拥有一个可以容纳不同类型的变量 - 类似于union - 但是您没有指定它可以使用哪种类型hold(与union不同),它实际上跟踪它当前持有的类型(与union不同),因此使用起来更安全。