Скажи, что я генерирую Casts
Пространство имен, которое будет содержать множество функций приведения:
namespace Casts
{
// To string
bool Cast(bool bValue, string& res);
bool Cast(int intValue, string& res);
bool Cast(float floatValue, string& res);
bool Cast(const wstring& str, string& res);
// From string
bool Cast(const string& strVal, bool& res);
bool Cast(const string& strVal, int& res);
bool Cast(const string& strVal, long& res);
bool Cast(const string& strVal, float& res);
// And lots of other casting functions of different types
}
мне действительно нравится подталкивание: lexical_cast подход. Например:
bool Cast(int intValue, string& res)
{
bool bRes = true;
try { res = lexical_cast<string>(intValue); }
catch(bad_lexical_cast &) { bRes = false; }
return bRes;
}
Мой вопрос, есть ли другие возможные подходы для реализации Casts
в элегантной, равномерной и надежной манере. Идеальный способ для меня — это иметь собственный легкий подход.
Да, вы можете в основном делать то, что boost::lexical_cast
делает внутренне: использовать поток. И вы можете объединить множество функций в несколько шаблонов функций:
namespace Casts
{
template <class From>
bool Cast(From val, string &res)
{
std::ostringstream s;
if (s << val) {
res = s.str();
return true;
} else {
return false;
}
}
template <class To>
bool Cast(const string &val, To &res)
{
std::istringstream s(val);
return (s >> res);
}
}
Возможно, вам придется предоставить конкретные перегрузки для wstring
версия (игра с widen
в них), но это все.