如何写出像"size_t s = 16 MByte"这样的文字常量?
How to write a literal constant like "size_t s = 16 MByte"?
今天在我们的代码库中发现了下面这行代码,我很喜欢它写内存大小的优雅方式。我想知道这是如何编译的。
size_t poolSize = 16 MByte;
有一个解是我自己的答案。还有其他解决方案吗?
在现代c++中,你应该定义一个文字符号,例如
auto operator""_MB( unsigned long long const x )
-> long
{ return 1024L*1024L*x; }
然后编写
long const poolSize = 16_MB;
不要使用宏,它们是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;
这是对古老的宏的一个简单而聪明的使用。
#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;
没有魔法,没有问题,只是工作。
相关文章:
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 如何使用字符串文字作为宏参数
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 构造<int>具有 2 个字符串文字的向量
- 将数字打印成文字
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 方便地对C++中的所有字符串文字进行模糊处理
- C++17 十六进制浮点文字单精度后缀冲突?
- 常量函数,当其参数是对文字类型的引用时
- 连接 LPCSTR 变量和文字?
- 比较 std::string 和 C 样式字符串文字
- 如何从char16_t字符串文字中读取双精度?
- 指内置类型的文字
- 分配给浮点数的积分文字除法 - 为什么结果是错误的?
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 为什么带有指针子对象的文字类类型的 constexpr 表达式不能是非类型模板参数
- 为什么文字不是常量(字符串除外)?
- 模板接受常量,但不接受文字
- 如何写出像"size_t s = 16 MByte"这样的文字常量?