Обертка — лексическая модель Переполнение стека

Как мы можем написать лексическую функцию приведения-обертки для реализации таких строк:

int value = lexical_cast<int> (string)

Я довольно новичок в программировании и мне было интересно, как мы можем написать функцию. Я не знаю, как понять шаблон. Также можем ли мы написать функцию-обертку для double тоже? подобно

double value = lexical_cast2<double> (string)

??

1

Решение

Чтобы это было так, как вы указали в своем примере:

#include <sstream>

template <class Dest>
class lexical_cast
{
Dest value;
public:
template <class Src>
lexical_cast(const Src &src) {
std::stringstream s;
s << src;
s >> value;
}

operator const Dest &() const {
return value;
}

operator Dest &() {
return value;
}
};

Включая проверку ошибок:

    template <class Src>
lexical_cast(const Src &src) throw (const char*) {
std::stringstream s;
if (!(s << src) || !(s >> value) || s.rdbuf()->in_avail()) {
throw "value error";
}
}
6

Другие решения

Вы можете попробовать что-то вроде этого:

#include <sstream>
#include <iostream>

template <class T>
void FromString ( T & t, const std::string &s )
{
std::stringstream str;
str << s;
str >> t;
}

int main()
{
std::string myString("42.0");

double value = 0.0;

FromString(value,myString);

std::cout << "The answer to all questions: " << value;

return 0;
}
1

Если это не пример и если ваша цель — просто преобразовать строку в другие типы:

Если вы используете C ++ 11, есть новые функции преобразования.

так что вы можете сделать что-то вроде

std::stoi -> int
std::stol -> long int
std::stoul -> unsigned int
std::stoll -> long long
std::stoull -> unsigned long long
std::stof -> float
std::stod -> double
std::stold -> long double

http://www.cplusplus.com/reference/string/

Если не C ++ 11, вы можете использовать

int i = atoi( my_string.c_str() )
double l = atof( my_string.c_str() );
1

Вы могли бы просто использовать этот заголовок. И писать такие вещи, какto<std::string>(someInt) или же to<unsigned byte>(1024), Вторая часть бросит и скажет вам, что вы делаете плохие вещи.

0
По вопросам рекламы [email protected]