вы можете использовать эту функцию-шаблон, но она предназначена не только для преобразования строки в int - она предназначена для преобразования строки в каждый тип:
template <typename T>
T ConvertString( const std::string &data )
{
if( !data.empty( ))
{
T ret;
std::istringstream iss( data );
if( data.find( "0x" ) != std::string::npos )
{
iss >> std::hex >> ret;
}
else
{
iss >> std::dec >> ret;
}
if( iss.fail( ))
{
std::cout << "Convert error: cannot convert string '" << data << "' to value" << std::endl;
return T( );
}
return ret;
}
return T( );
}
Если вы хотите сейчас, если преобразование было успешным, то верните конкретное значение в if iss.fail()
или передайте второй ссылочный аргумент функции и установите значение false, если оно не удалось.
Вы можете использовать это так:
uint16_t my_int = ConvertString<uint16_t>("15");
Если вам нравится решение со ссылочным аргументом, вот пример:
#include <iostream>
#include <sstream>
#include <string>
#include <inttypes.h>
template <typename T>
T ConvertString(const std::string &data, bool &success)
{
success = true;
if(!data.empty())
{
T ret;
std::istringstream iss(data);
if(data.find("0x") != std::string::npos)
{
iss >> std::hex >> ret;
}
else
{
iss >> std::dec >> ret;
}
if(iss.fail())
{
success = false;
return T();
}
return ret;
}
return T();
}
int main(int argc, char **argv)
{
bool convert_success;
uint16_t bla = ConvertString<uint16_t>("15", convert_success);
if(convert_success)
std::cout << bla << std::endl;
else
std::cerr << "Could not convert" << std::endl;
return 0;
}
person
tuxtimo
schedule
11.12.2012
std::stoi
(также в ответах) выдает исключение, если что-то пойдет не так, но все равно принимает такие вещи, как123abc
, возвращая только 123 в качестве ответа.lexical_cast
запрещает123abc
, но принимает строки с пробелами, преобразовывая только первое слово. Если вы хотите, чтобы он был более детализированным, вы можете создать собственную версию строкового потока. Конечно, всегда есть старый добрыйstrtol
. - person chris   schedule 11.12.2012