当作为可变参数传递时,获取变量所升级的类型大小的标准方法是否存在?
auto x = ...;
auto y = sizeof(promoted(x));
结果应该是:
char -> sizeof(int)
int -> sizeof(int)
float -> sizeof(double)
...
当作为可变参数传递时,获取变量所升级的类型大小的标准方法是否存在?
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.);
在此之前,请先区分浮点数和整数。
同样,我认为你不能同时处理整数和浮点数,因为我们在这里应用的“提升”有不同的含义。
+x
的具体情况是如何让它工作的吗? - Cory Kramer4.6
)。 - Shafik Yaghmour我们可以使用正确的类型声明重载的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)>)
template<class T> std::integral_constant<size_t, sizeof(promoted_t<T>)> promote_size( T const& ) { return {}; }
。这样我们就可以得到 promote_size('a')
的编译时常量 4
。 - Yakk - Adam Nevraumont<type_traits>
。 :-( - Eugene Ryabtsev