C++中能否不使用#define,依据常量值定义对应类型?
不用#define实现基于IntBits的Float类型映射
可以不用#define来实现这个需求,具体方案分C++和C两种环境:
C++ 方案:模板元编程
利用C++的编译期模板特性,通过std::conditional_t在编译期直接推导对应浮点类型,完全不需要宏定义:
#include <type_traits> // 编译期类型选择模板 template<int IntBits> struct FloatTypeMap { using type = typename std::conditional_t< IntBits <= 32, __float32, typename std::conditional_t< IntBits <= 64, __float64, typename std::conditional_t< IntBits <= 128, __float128, void // 超过128位可自定义 fallback,比如触发编译错误 >::type >::type >; }; // 简化类型别名 template<int IntBits> using Float = typename FloatTypeMap<IntBits>::type; // 使用示例 int main() { Float<32> f32; // 等价于 __float32 f32; Float<40> f40; // 等价于 __float64 f40; Float<64> f64; // 等价于 __float64 f64; Float<100> f100; // 等价于 __float128 f100; Float<128> f128; // 等价于 __float128 f128; return 0; }
如果使用C++17及以上,也可以结合constexpr if实现类似逻辑,但模板特化的方式更适合直接定义类型别名。
C 方案:_Generic 编译期选择
C11及以后支持_Generic选择器,结合编译期常量计算,可以避免直接用#define定义类型(仅用宏辅助生成选择分支,而非直接定义类型别名):
// 编译期计算IntBits对应的分支索引 #define BITS_CATEGORY(IntBits) ((IntBits <= 32) ? 1 : ((IntBits <= 64) ? 2 : 3)) // 利用_Generic选择对应浮点类型 #define Float(IntBits) _Generic((int[]){BITS_CATEGORY(IntBits)}, \ int[1]: __float32, \ int[2]: __float64, \ int[3]: __float128 \ ) // 使用示例 int main() { Float(32) f32; // __float32 Float(40) f40; // __float64 Float(64) f64; // __float64 Float(100) f100; // __float128 Float(128) f128; // __float128 return 0; }
这里的宏仅用于辅助生成编译期的类型选择逻辑,并没有直接用#define硬编码类型别名,符合需求。
内容的提问来源于stack exchange,提问作者George Kourtis
相关产品推荐
相关产品推荐

