我希望(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;
}
答案 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);
}
注意:这不会复制shared
。 std.traits.CopyConstness
将复制const和shared-ness。