因此,我们有int32_t、int16_t、uint64_t等.但是atoi32、atoi16、atoui64等在哪里.
So, we have int32_t, int16_t, uint64_t, etc.. But where are the atoi32, atoi16, atoui64, etc...?
我想将表示数字的字符串输入转换为相应的数字类型。问题是我有严格的类型要求,因此,例如,我不能接受需要int16_t
值(带符号)的x>=2^15。
在不从头开始编写所有转换函数的情况下,我如何处理这种情况?
p.S.
请不要建议boost::lexical_cast
-我已经在使用它了。我所说的函数将通过特定的模板专业化来取代lexical_cast
模板的默认实现,即:
template<>
inline int32_t lexical_cast<int32_t,char const *>(const char * const & arg)
{
}
template<>
inline int16_t lexical_cast<int16_t,char const *>(const char * const & arg)
{
}
...
理想情况下,最好有atoi32
、atoi16
、atoiu64
等功能。
编辑
我使用的是VS2010,所以<cinttypes>
运气不好。
是的,如果有一个改进的atoi
函数族,具有与strtol
相同的错误支持,那就太好了。
EDIT2
我觉得发布我的解决方案是值得的:
#pragma once
#include <boost/lexical_cast.hpp>
#include <limits>
namespace boost {
template<class TInt, class conv>
TInt atoi(conv f, const char *arg)
{
char* stop;
TInt res = f(arg, &stop, 10);
if (*stop)
{
throw_exception(bad_lexical_cast(typeid(TInt), typeid(const char *)));
}
return res;
}
template<class TInt>
typename std::enable_if<std::is_signed<TInt>::value, TInt>::type atoi(const char *arg)
{
char* stop;
long res = strtol(arg, &stop, 10);
if (*stop || std::numeric_limits<TInt>::min() > res || std::numeric_limits<TInt>::max() < res)
{
throw_exception(bad_lexical_cast(typeid(TInt), typeid(const char *)));
}
return (TInt)res;
}
template<class TInt>
typename std::enable_if<std::is_unsigned<TInt>::value, TInt>::type atoi(const char *arg)
{
char* stop;
unsigned long res = strtoul(arg, &stop, 10);
if (*stop || std::numeric_limits<TInt>::max() < res)
{
throw_exception(bad_lexical_cast(typeid(TInt), typeid(const char *)));
}
return (TInt)res;
}
template<> inline int8_t lexical_cast<int8_t,char const *>(const char * const & arg)
{
return atoi<int8_t>(arg);
}
template<> inline uint8_t lexical_cast<uint8_t,char const *>(const char * const & arg)
{
return atoi<uint8_t>(arg);
}
template<> inline int16_t lexical_cast<int16_t,char const *>(const char * const & arg)
{
return atoi<int16_t>(arg);
}
template<> inline uint16_t lexical_cast<uint16_t,char const *>(const char * const & arg)
{
return atoi<uint16_t>(arg);
}
template<> inline int32_t lexical_cast<int32_t,char const *>(const char * const & arg)
{
return atoi<int32_t>(strtol, arg);
}
template<> inline uint32_t lexical_cast<uint32_t,char const *>(const char * const & arg)
{
return atoi<uint32_t>(strtoul, arg);
}
template<> inline int64_t lexical_cast<int64_t,char const *>(const char * const & arg)
{
return atoi<int64_t>(_strtoi64, arg);
}
template<> inline uint64_t lexical_cast<uint64_t,char const *>(const char * const & arg)
{
return atoi<uint64_t>(_strtoui64, arg);
}
template<> inline double lexical_cast<double,char const *>(const char * const & arg)
{
char* stop;
double res = strtod(arg, &stop);
if (*stop)
{
throw_exception(bad_lexical_cast(typeid(double), typeid(const char *)));
}
return res;
}
template<> inline float lexical_cast<float,char const *>(const char * const & arg)
{
char* stop;
double res = strtod(arg, &stop);
if (*stop || -FLT_MAX > res || FLT_MAX < res)
{
throw_exception(bad_lexical_cast(typeid(float), typeid(const char *)));
}
return res;
}
}
所以,最后我使用的是strtol
函数族。不幸的是,建议使用它们的人也删除了他的帖子,我想知道为什么。。。
scanf
系列的<cstdio>
函数实现了所有必需的转换,<cinttypes>
(在C++11中;<inttypes.h>
在带有C99库的C++98编译器中)定义了适当的格式字符串说明符。例如,要从C字符串s
中读取int16_t
,请执行
int16_t i;
std::sscanf(s, "%"SCNd16, &i);
相关文章:
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 我有三个 getline,但是一旦编译,输入就太多了
- 我要求用户输入大小和数组,但是当我打印矢量时,它仅显示'0'作为输出
- 我在 C++ 中创建了一个函数来递归反转字符串,但是之后如何使功能打印一个 endl?
- 如果我们在其中输入一个整数,则字符会给出整数作为输出,但是当分配给它一个整数时,这不会发生。为什么?
- 使用Visual Studio 2012编译时,此代码会给我错误,但是使用代码块就可以了
- 错误:类没有名为"ThisW"的成员;你是说"这个"吗?但是代码没有说"ThisW",它已经说了"This"
- 为什么完整的字符串没有一次打印,但是当我尝试逐个字符打印时
- 我已经创建了一个模板函数,但是在检查输入是奇数还是偶数时收到错误 C++.
- 我收到一个断言错误,但是当我编写 cout 语句时,它会消失
- C++ .我正在尝试通过使用开关内的数组来获取用户输入,但是当我运行代码时,它显示分段错误?
- c++curl返回413请求实体过大,但是post大小远小于max大小
- 我想覆盖运算符'='但是在重载之后,运算符没有将正确的信息传递给对象
- tensorflow:transpose需要一个大小为1的向量.但是输入(1)是大小为2的向量
- 我正在努力处理多维数组输入和输出,我管理输入,但是打印无法按计划工作
- 我正在编写一个代码来将 int 数组存储在文件中,然后用 c++ 检索它,但是检索第一项是假值,我该如何解决这个问题?
- C++11: 如何编写一个像 Get 一样工作的模板函数<tuple>...但是收到参数包?
- 因此,我们有int32_t、int16_t、uint64_t等.但是atoi32、atoi16、atoui64等在哪里.