Если вы ожидаете целое число, я бы использовал boost::lexical_cast
.
std::string some_string = "345";
int val = boost::lexical_cast<int>(some_string);
Если он не может привести к целому числу, он бросит. Производительность довольно разумна, и она сохраняет ваш код очень чистым.
Я не знаю ни о какой не бросающей версии. Вы можете использовать что-то вроде этого, хотя я обычно стараюсь не допустить, чтобы исключения управляли программой.
bool cast_nothrow(const std::string &str, int &val) {
try {
val = boost::lexical_cast<int>(str);
return true;
} catch (boost::bad_lexical_cast &) {
return false;
}
}
Edit:
Я бы не советовал проверять целочисленную проверку структуры, как вы описали. Хорошие функции делают одно и одно хорошо.
Обычно вам нужен более формальный синтаксический анализатор для обработки таких вещей. Мой честный совет - встроить язык сценариев или библиотеку в ваш проект. Это нетривиально, так что пусть кто-то другой делает тяжелую работу.
Если бы я действительно попытался реализовать то, что вы предлагаете, я бы, вероятно, сделал бы решение на основе стека, сохраняя уровни скобок в их собственном стековом фрейме. Самое простое - просто жестко закодировать простые операторы (скобки, сложения, подпрограммы и т. Д.) И предположить, что все остальное - число.
В конце концов вы захотите, чтобы все было разбито на какой-то тип выражения. Это может выглядеть примерно так:
struct Expression {
virtual ~Expression() {}
virtual float value() const = 0;
};
struct Number : public Expression {
virtual float value() const {return val;}
float val;
};
struct AdditionOper : public Expression {
virtual float value() const {return lhs->value() + rhs->value();}
boost::shared_ptr<Expression> lhs;
boost::shared_ptr<Expression> rhs;
};
Я бы начал с разбора скобок, они будут определять порядок ваших выражений. Затем я разделил бы все на основе числовых операндов и начал бы помещать их в выражения. Тогда у вас останутся такие случаи, как 3 + 4 * 6
, которые потребуют некоторой осторожности для правильного порядка операций.
Удачи.