D保持常数(DLang)

时间:2016-08-23 01:51:44

标签: type-conversion const d immutability type-punning

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

在两种情况下,我应该如何处理保持类型的常量不变,不抛弃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;
    }

1 个答案:

答案 0 :(得分:4)

使用profile-guided optimization,它返回带有第一个const-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);
}

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