D 返回动态类型

D 返回动态类型,d,variant,dynamic-typing,phobos,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"); } 我不知道我是否可以转换为对象并更改原型 由于所有< P> D,如C、C++、C等,j

我知道你喜欢什么

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");
}
我不知道我是否可以转换为对象并更改原型

由于所有

< P> D,如C、C++、C等,java是静态类型语言。所有类型必须在编译时已知。所以,不,你不能做你想做的事

现在,您可以使用或获取一种形式的动态键入,但与您正在尝试的不太一样。这只适用于动态语言

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

  • 使用联合,您可以有一个变量,该变量可以使用相同的内存保存不同的类型(因此一次只能是一种类型),但它通常被认为是一个相当低级的构造,如果您真的不需要它,最好避免使用它。一个联合不跟踪它当前的类型,因此如果它可以是
    int
    字符串
    ,它很容易持有
    int
    ,但是你把它当作
    字符串
    (或反之亦然)使用,会导致严重的错误

  • 使用
    Variant
    (这可能是您想要使用的),您可以有一个变量可以保存不同的类型-类似于联合-但您不指定它可以保存哪些类型(不同于联合),它实际上跟踪它当前保存的类型(不同于联合),因此使用起来更安全


你打算用它做什么?答案很好,但IMHO variant(特别是正在开发的新变体)基本上是D中动态类型的一种实现。@dsimcha是的,
variant
基本上是在静态类型的基础上实现动态类型,但该语言本身并不真正支持动态类型。