2016-08-23 3 views
0

Я бы хотел (1) объявить целое число без знака, которое имеет тот же размер, что и заданное имя или тип данного выражения, и (2) предоставить преобразование типа для этого типа, который просто проходит битформат аргумента не изменился. (Даже в случае прохождения поплавка, скажем, мне нужно, чтобы он преобразовывался в правильную ширину, которая точно сохраняет битпаттер.)D сохраняющая константа (DLang)

Как я должен иметь дело с сохранением константы типа без изменений, в обоих случаях , не отказываясь от const или неизменяемого?

Вот моя частичная попытка:

template TUint_t(alias T) 
    { 
    static if (T.sizeof * 8 == 64) 
     alias TUint_t = uint64_t; 
    else static if (T.sizeof * 8 == 32) 
     alias TUint_t = uint32_t; 
    else static if (T.sizeof * 8 == 16) 
     alias TUint_t = uint16_t; 
    else static if (T.sizeof * 8 == 8) 
     alias TUint_t = uint8_t; 
    else static assert (false); 
    } 

auto ConvertToBitPattern(T)(inout T x) 
    { 
    return * cast(TUint_t!(T) *) &x; 
    } 

ответ

4

Использование std.traits.CopyConstness, который возвращает второй параметр типа с сопзЬ-Ness классификатором первым.

template TUint_t(alias T) 
{ 
    static if (T.sizeof * 8 == 64) 
     alias U = uint64_t; 
    else static if (T.sizeof * 8 == 32) 
     alias U = uint32_t; 
    else static if (T.sizeof * 8 == 16) 
     alias U = uint16_t; 
    else static if (T.sizeof * 8 == 8) 
     alias U = uint8_t; 
    else static assert (false); 

    // Apply T's const-ness to U 
    alias TUint_t = CopyConstness!(T, U); 
} 

Примечание: это не копирует shared. std.traits.CopyTypeQualifiers будет копировать const и shared-ness.

+0

много спасибо за ваш великолепно полезный и быстрый ответ! –

Смежные вопросы