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