如何写一个像“size_t s = 16 MByte”的字面常量?

今天在我们的代码库find了下面这行,并且喜欢它的优雅来写一个内存大小。 想知道这是如何编译的几分钟。

size_t poolSize = 16 MByte; 

一个解决scheme是作为我自己的答案。 任何其他解决scheme

在现代的C ++中,你应该定义一个文字符号 ,例如

 auto operator""_MB( unsigned long long const x ) -> long { return 1024L*1024L*x; } 

然后写

 long const poolSize = 16_MB; 

不要使用macros,它们是Evil™ 。 在很多方面。


免责声明:代码没有被编译器的手感动。

当然,你应该使用模板元编程来解决这个问题:

 #include <iostream> #include <type_traits> template<long long N, long long M> struct is_power_of { static constexpr bool value = (N%M != 0)? false : is_power_of<N/M, M>::value; }; template<long long M> struct is_power_of<0, M> : public std::false_type { }; template<long long M> struct is_power_of<1, M> : public std::true_type { }; template<long long N, typename = typename std::enable_if<is_power_of<N, 1024>::value>::type> struct bytes { enum {value = N, next = value * 1024}; template<long long M> struct compile_time_get { enum {value = N*M}; }; static long long run_time_get(long long x) {return N*x;} }; typedef bytes<1> byte; typedef bytes<byte::next> kilo_byte; typedef bytes<kilo_byte::next> mega_byte; typedef bytes<mega_byte::next> giga_byte; typedef bytes<giga_byte::next> tera_byte; typedef bytes<tera_byte::next> peta_byte; typedef bytes<peta_byte::next> eksa_byte; int main() { std::cout << kilo_byte::compile_time_get<3>::value << std::endl; int input = 5; std::cout << mega_byte::run_time_get(input) << std::endl; } 

输出:

 3072 5242880 

生活

如果你要做很多事情,那么用户定义的文字就是要走的路。 OTOH,一次性(并支持较老的编译器和其他语言),我会去直接:

 size_t poolSize = 16ul*1024*1024; 

这是一个简单而巧妙的使用旧的macros。

 #define KByte *1024 #define MByte *1024*1024 #define GByte *1024*1024*1024 

所以size_t poolSize = 16 MByte; 被翻译成

 size_t poolSize = 16 *1024*1024; 

我看到的所有例子都更像

 #define KB 1024 #define MB (1024*1024) size_t poolSize = 16*MB; 

没有魔法,没有问题,只是工作。