获得sizeof(提升(x))的标准方法
The standard way to get sizeof(promoted(x))
是否有一种标准方法来获取变量作为可变参数传递时将提升到的类型的大小?
auto x = ...;
auto y = sizeof(promoted(x));
结果应该是:
char -> sizeof(int)
int -> sizeof(int)
float -> sizeof(double)
...
auto s = sizeof(+x);
应该能处理整数。
+x
使用一元+
运算符,它像其他算术运算符一样进行整数提升。
我不知道float
的任何标准提升规则适用于这里(在整数提升意义上),因为您可以在不提升的情况下使用它们进行算术。如果您总是希望至少提升到double
,您可以尝试
auto s = sizeof(x + 0.);
,然后在到达之前区分浮点数和整数。
同样,我不认为你可以同时处理整数和浮点数,因为我们在这里应用的"提升"的含义不同。
可以简单地用适当的类型声明重载的promoted
函数:
int promoted(char);
int promoted(short);
int promoted(int);
long promoted(long);
long long promoted(long long);
double promoted(float);
double promoted(double);
long double promoted(long double);
注意这些函数不需要实现,因为我们从来没有真正调用过它们。
下面是一个简单的测试运行,在我的机器上打印1,4和4,8:std::cout << sizeof('a') << 'n';
std::cout << sizeof(promoted('a')) << 'n';
std::cout << sizeof(3.14f) << 'n';
std::cout << sizeof(promoted(3.14f)) << 'n';
为了概括Baum mit Augen的答案,您可以这样编写函数模板:
template <typename T>
auto promoted(T)
-> std::enable_if_t<std::is_integral<T>::value, decltype(+T{})>;
template <typename T>
auto promoted(T)
-> std::enable_if_t<std::is_floating_point<T>::value, decltype(T{}+0.)>;
//usage
sizeof(promoted(a))
或者使用类型特征的版本:
template <typename T, typename = void>
struct promoted;
template <typename T>
struct promoted<T, std::enable_if_t<std::is_integral<T>::value>>
{ using type = decltype(+T{}); };
template <typename T>
struct promoted<T, std::enable_if_t<std::is_floating_point<T>::value>>
{ using type = decltype(T{} + 0.); };
template <typename T>
using promoted_t = typename promoted<T>::type;
//usage
sizeof(promoted_t<decltype(a)>)
相关文章:
- 没有取消引用/解包对象的标准方法?
- 是否有一种标准方法来计算两个 asctime() 值之间的天数
- 导入模块的标准方法
- 有没有一种标准方法可以在C++中获取第 n 个"下一个"浮点值
- C++ 捕获异常后进行清理的标准方法是什么?
- memcpy 是将浮子打包到 uint32 中的标准方法吗?
- 读取二进制文件的惯用C++17标准方法是什么
- 在 c++ 中创建 dll 并在 delphi 中调用的标准方法
- 在 NTL 中构造多项式的标准方法是什么?
- C 是否具有对两个STD :: sets,vectors等进行三角比较的标准方法
- 获取非专用标准::矢量容器的标准方法<bool>
- 将结构传递到头文件的标准方法
- C 11中的标准方法是什么,可以访问std :: vector中元素n的指针
- 组合来自多个线程的数据的标准方法?
- 标准::字符串::空的未定义符号错误;Mac OS High Sierra 上的 c++ 标准方法链接错误
- 在C++中初始化布尔向量的标准方法是什么
- 在C 中对二进制对象进行编码/解码的标准方法
- 有没有一种标准方法来确保一段代码在全局范围内执行
- 处理对存储在私有映射中的值的封装访问的标准方法,而不破坏C++中的抽象
- 是否有一种替换C风格的Bool数组的标准方法