Eug*_*sev 15 c++ sizeof type-promotion
当作为可变参数传递时,是否有一种标准的方法来获得变量的类型大小?
auto x = ...;
auto y = sizeof(promoted(x));
Run Code Online (Sandbox Code Playgroud)
结果应该是:
char -> sizeof(int)
int -> sizeof(int)
float -> sizeof(double)
...
Run Code Online (Sandbox Code Playgroud)
Bau*_*gen 19
auto s = sizeof(+x);
Run Code Online (Sandbox Code Playgroud)
应该做整数的技巧.
+x使用一元运算+符,它像任何其他算术运算符一样执行整数提升.
我不知道任何标准的促销规则float适用于此(在整数提升意义上),因为您可以在不进行推广的情况下对它们进行算术运算.如果你总想提升到至少double你可以试试
auto s = sizeof(x + 0.);
Run Code Online (Sandbox Code Playgroud)
然后在到达之前区分浮点和整数.
同样,我不认为你可以同时处理整数和浮点数,因为我们在这里应用的"促销"的含义不同.
fre*_*low 17
我们可以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);
Run Code Online (Sandbox Code Playgroud)
请注意,函数不需要实现,因为我们实际上从不调用它们.
这是一个简单的测试运行,在我的机器上打印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';
Run Code Online (Sandbox Code Playgroud)
Tar*_*ama 13
为了概括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))
Run Code Online (Sandbox Code Playgroud)
或者使用类型特征的版本:
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)>)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
788 次 |
| 最近记录: |