D 保持常量 (DLang)

D preserving constness (DLang)

我想 (1) 声明一个无符号整数,它的大小与给定类型名或给定表达式的类型相同,并且 (2) 提供到该类型的类型转换,该类型仅传递参数不变。 (例如,即使在传递浮点数的情况下,我也需要将其转换为正确宽度的 uint,以忠实地保留位模式。)

我应该如何处理保持类型的常量不变,在这两种情况下,不丢弃常量或不可变?

这是我的部分尝试:

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

使用 std.traits.CopyConstness,其中 returns 具有第一个常量限定符的第二个类型参数。

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

注意:这不会复制 sharedstd.traits.CopyTypeQualifiers 将复制 const 和 shared-ness。