【发布时间】:2018-11-26 19:59:44
【问题描述】:
我想将一个数字映射到一个类型。对于这个例子,我将创建一个函数,将 sizeof() 结果映射到有符号的原始类型。
我想知道在现代 C++ 中是否有更好的方法来执行我在下面所做的事情,即获取模板值并将其转换为类型。现在这适用于将大小转换为已知类型,但我似乎无法在标准库中找到任何我想要的东西。我错过了什么吗?
如果没有,是否有更好的方法来执行此操作或清理此代码?例如,如果将来我们以某种方式最终拥有 128 位类型,那么这将不支持。
#include <iostream>
#include <type_traits>
template <size_t S>
static constexpr auto sizeToType() {
static_assert(S == 1 or S == 2 or S == 4 or S == 8, "Bad type size");
if constexpr (S == 1)
return int8_t{};
else if constexpr (S == 2)
return int16_t{};
else if constexpr (S == 4)
return int32_t{};
else
return int64_t{};
}
int main() {
using MY_TYPE = decltype(sizeToType<2>());
MY_TYPE myType = MY_TYPE(0xFFFFFFFFFFFFFFFEUL);
std::cout << sizeof(MY_TYPE) << " bytes" << std::endl;
std::cout << "MY_TYPE(0xFFFFFFFFFFFFFFFEUL) = " << myType << std::endl;
}
输出(如预期):
2 bytes
MY_TYPE(0xFFFFFFFFFFFFFFFEUL) = -2
【问题讨论】:
-
您的解决方案有什么问题?鉴于您编写的代码只能使用现代 c++,我想知道问题是什么
-
@user463035818 正如我在帖子中所说,我想知道是否有更好的方法来做到这一点,或者如果引入新的方法可以扩展到任何原始大小类型(例如:@ 987654325@ 如看到 here 如果支持)自动而无需更新代码。我也想知道是否有一种不那么冗长和不那么脆弱的方式来做我所做的事情。
-
即使您在示例中使用的类型也只是可选的,并且是provided only if the implementation directly supports the type。
-
我们是否同意您的解决方案不支持任何类型,因为 size 确实是获得类型平等的糟糕方法?也就是说,您可以使用支持类型的元组并在其中找到与大小匹配的类型