2010-12-15 2 views
17

Я видел некоторые ответы на другие вопросы boost::lexical_cast, которые утверждают следующее возможно:Как использовать boost :: lexical_cast и std :: boolalpha? то есть повышение :: lexical_cast < bool > («истина»)

bool b = boost::lexical_cast<bool>("true"); 

Это не работает для меня с г ++ 4.4.3 импульса 1,43. (Может быть, это правда, что он работает на платформе, где по умолчанию установлен std :: boolalpha)

This - отличное решение для проблемы с строкой, но она не имеет проверки ввода, которую обеспечивает boost :: lexical_cast.

+4

Мнения о публикации ответа на свой вопрос неоднозначны, но, по крайней мере, отправьте свой ответ в качестве ответа. – robert 2010-12-15 16:16:54

+3

Пожалуйста, напишите свой ответ ** в качестве ответа **. – 2010-12-15 16:17:19

ответ

15

Я отправляю ответ на свой вопрос здесь для тех, кто может быть ищет что-то вроде этого:

struct LocaleBool { 
    bool data; 
    LocaleBool() {} 
    LocaleBool(bool data) : data(data) {} 
    operator bool() const { return data; } 
    friend std::ostream & operator << (std::ostream &out, LocaleBool b) { 
     out << std::boolalpha << b.data; 
     return out; 
    } 
    friend std::istream & operator >> (std::istream &in, LocaleBool &b) { 
     in >> std::boolalpha >> b.data; 
     return in; 
    } 
}; 

использование:

#include <boost/lexical_cast.hpp> 
#include <iostream> 
#include "LocaleBool.hpp" 

int main() { 
    bool b = boost::lexical_cast<LocaleBool>("true"); 
    std::cout << std::boolalpha << b << std::endl; 
    std::string txt = boost::lexical_cast<std::string>(LocaleBool(b)); 
    std::cout << txt << std::endl; 
    return 0; 
} 
10

В дополнение к форме ответа Пойндекстер вы можете обернуть метод из here в специализированной версии boost::lexical_cast:

namespace boost { 
    template<> 
    bool lexical_cast<bool, std::string>(const std::string& arg) { 
     std::istringstream ss(arg); 
     bool b; 
     ss >> std::boolalpha >> b; 
     return b; 
    } 

    template<> 
    std::string lexical_cast<std::string, bool>(const bool& b) { 
     std::ostringstream ss; 
     ss << std::boolalpha << b; 
     return ss.str(); 
    } 
} 

И использовать его:

#include <iostream> 
#include <boost/lexical_cast.hpp> 

//... specializations 

int main() { 
    bool b = boost::lexical_cast<bool>(std::string("true")); 
    std::cout << std::boolalpha << b << std::endl; 
    std::string txt = boost::lexical_cast<std::string>(b); 
    std::cout << txt << std::endl; 

    return 0; 
} 

лично мне понравился этот подход, поскольку он скрывает специальный код (например, используя LocaleBool или to_bool(...) из ссылки) для преобразования в/из bools.

0

Сложите свой собственный шаблон в дополнение к лексическому броску повышения для синтаксического разбора. Обратите внимание на параметр «по умолчанию» в примере, чтобы обеспечить правильную работу перегрузки (не стесняйтесь использовать другое средство, если хотите).

template<typename T> 
T Parse(const std::string& valStr, const T& default=T()) { 
    T result = boost::lexical_cast<T>(valStr); 
} 

Затем, вы можете специализироваться на все, в том числе BOOLS:

template<> 
bool Parse(const std::string& valStr, const bool& default=true) { 
    if(strcmp(valStr.c_str(), "true") == 0) { 
     return true; 
    } 
    return false; 
} 

Очевидно, что существует целый ряд способов сделать это, и вы можете добавить больше условий для истинного против ложного (я бы убедитесь, что все варианты «ИСТИНА» и «ЛОЖЬ», как «Истина», плюс «Т» и «Ф» работают правильно). Вы даже можете расширить его до численного разбора.