Вернуть динамический тип - PullRequest
3 голосов
/ 02 ноября 2011

Я знаю, что шаблон похож на

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 Ответ

8 голосов
/ 02 ноября 2011

D, как C, C ++, C # и Java, является языком статической типизации. Все типы должны быть известны во время компиляции. Так что нет, ты не можешь делать то, что пытаешься сделать.

Теперь вы можете использовать наследование , союзы или std.variant.Variant , чтобы получить форму динамической типизации, но не совсем то, что вы Пытаешься сделать. Это работает только в динамических языках.

  • В случае классов ссылка на класс может указывать на экземпляр производного класса, а не на базовый класс, для которого предназначена ссылка, поэтому вы можете получить полиморфное / динамическое поведение, но тип базового класса известен во время компиляции и все, на что ссылается ссылка , должно быть производным типом и, следовательно, должно быть классом.

  • С объединениями вы можете иметь одну переменную, которая может содержать разные типы, используя одну и ту же память (так что это может быть только один тип за один раз), но обычно это считается довольно низкоуровневой конструкцией, и лучше ее избегать, если тебе это не нужно Объединение не отслеживает его текущий тип, поэтому, если оно может быть как int, так и string, для него довольно просто держать int, но вы используете его как string (или наоборот), вызывая неприятные ошибки.

  • С Variant (это, вероятно, то, что вы хотите использовать), вы можете иметь одну переменную, которая может содержать различные типы - подобно объединению - но вы не указываете, какие типы она может содержать ( в отличие от объединения), и он фактически отслеживает, какой тип он содержит (в отличие от объединения), поэтому его гораздо безопаснее использовать.

...