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

オブジェクトにキャストしてプロトタイプを変更できるかどうかわかりません。

ありがとうございます

4

1 に答える 1

8

D は、C、C++、C#、および Java と同様に、静的に型付けされた言語です。すべての型はコンパイル時に認識されている必要があります。だから、いいえ、あなたがやろうとしていることをすることはできません。

ここで、inheritanceunions、またはstd.variant.Variantを使用して動的型付けの形式を取得できますが、実行しようとしているものとはまったく異なります。これは動的言語でのみ機能します。

  • クラスでは、クラス参照は、参照の対象となる基本クラスではなく、派生クラスのインスタンスを指すことができるため、ポリモーフィック/動的な動作を得ることができますが、基本クラスの型はコンパイル時に認識されます。参照が参照するものは派生型である必要があり、したがってクラスである必要があります

  • ユニオンを使用すると、同じメモリを使用して異なる型を保持できる 1 つの変数を持つことができます (したがって、一度に 1 つの型しか保持できません)。それ。共用体は、その現在の型が何であるかを追跡しないため、intと の両方である可能性がある場合string、 を保持するのは非常に簡単ですが、intそれを としてstring(またはその逆に) 使用すると、厄介なバグが発生します。

  • (これVariantはおそらくあなたが使いたいものです)を使用すると、ユニオンと同様に、さまざまなタイプを保持できる1つの変数を持つことができますが、(ユニオンとは異なり)保持できるタイプを指定せず、実際に保持します(共用体とは異なり) 現在保持している型を追跡するため、より安全に使用できます。

于 2011-11-01T20:55:57.160 に答える