这个问题在这里已有答案:
我正在为图像版本制作GUI,我需要显示和处理用户的RGB值。因此,我使用uint8_t存储这些值和stringstream来从/获取/设置字符串的值。我的问题是uint8_t被认为是一个char,所以cast只返回字符串的第一个字符。
示例:假设我设置输入字符串“123”,我的返回值将为49(ASCII代码为“1”)
当我使用模板化函数来制作演员表时,我想尽可能少地修改代码(当然)。这是我使用的强制转换功能:
template<typename T>
T Cast(const std::string &str) {
std::stringstream stream;
T value;
stream << str;
stream >> value;
if (stream.fail()) {
Log(LOG_LEVEL::LERROR, "XMLCast failed to cast ", str, " to ", typeid(value).name());
}
return value;
}
所以,当我这样做
uint8_t myInt = Cast<uint8_t>("123");
我有49而不是123,任何想法?
您需要先将值读作unsigned (short) int
(或uint(16|32)_t
,如果您愿意),然后您可以将其截断为uint8_t
。由于您的函数是模板化的,因此您可以简单地为uint8_t
提供一个特殊化,以便与其他类型不同地处理它:
template<>
uint8_t Cast<uint8_t>(const std::string &str) {
std::istringstream stream(str);
uint16_t value;
if ((!(stream >> value)) || (value > 0x00FF)) {
Log(LOG_LEVEL::LERROR, "XMLCast failed to cast ", str, " to ", typeid(uint8_t).name());
}
return static_cast<uint8_t>(value);
}
看起来演员阵容不适合这里的工作。强制转换是将一个值重新解释为给定类型或将相似类型转换为彼此(想想,double转换为int,反之亦然,或者指向派生类指针的基类指针)。类型字符串和整数以这种方式不是密切相关的。我想你想要做的是显式地将字符串转换为一个整数,这表明std::stoi()
是你想要的。
void Foo( const std::string& str )
{
const auto i = std::stoi( str );
std::cout << i << '\n';
// ...
}
int main()
{
Foo( "123" );
}
印刷品:123
。在Coliru上看到它。