2014-10-06 88 views
3

boost單元庫提供了有用的編譯時間「度量單位」類型檢查。它還提供流io操作來序列化單元。然而,我正在努力與字符串解析位。 例如,下面幾行:解析字符串流的boost單元

boost::units::quantity<boost::units::si::force> f(2.0 * boost::units::si::newton); 
std::cout << "Force = " << f << std::endl; 

產生輸出:

Force = 2.0 N 

有人可以指向我分析這些標準序列回壓單元的例子嗎?

// f.parse_string("2.0 N"); or using stream operators?? 

謝謝!

回答

2

它不直接被圖書館支持。

有,可以給一些啓示的例子:http://www.boost.org/doc/libs/1_56_0/doc/html/boost_units/Examples.html#boost_units.Examples.RuntimeUnits

此示例說明如何實現一個接口,在運行時允許不同 單位,同時仍保持對內部 計算類型安全。

namespace { 

using namespace boost::units; 
using imperial::foot_base_unit; 

std::map<std::string, quantity<si::length> > known_units; 

} 

quantity<si::length> calculate(const quantity<si::length>& t) 
{ 
    return(boost::units::hypot(t, 2.0 * si::meters)); 
} 

int main() 
{ 
    known_units["meter"] = 1.0 * si::meters; 
    known_units["centimeter"] = .01 * si::meters; 
    known_units["foot"] = 
     conversion_factor(foot_base_unit::unit_type(), si::meter) * si::meter; 

    std::string output_type("meter"); 
    std::string input; 

    while((std::cout << "> ") && (std::cin >> input)) 
    { 
     if(!input.empty() && input[0] == '#') 
     { 
      std::getline(std::cin, input); 
     } 
     else if(input == "exit") 
     { 
      break; 
     } 
     else if(input == "help") 
     { 
      std::cout << "type \"exit\" to exit\n" 
       "type \"return 'unit'\" to set the return units\n" 
       "type \"'number' 'unit'\" to do a simple calculation" 
       << std::endl; 
     } 
     else if(input == "return") 
     { 
      if(std::cin >> input) 
      { 
       if(known_units.find(input) != known_units.end()) 
       { 
        output_type = input; 
        std::cout << "Done." << std::endl; 
       } 
       else 
       { 
        std::cout << "Unknown unit \"" << input << "\"" 
         << std::endl; 
       } 
      } 
      else 
      { 
       break; 
      } 
     } 
     else 
     { 
      try 
      { 
       double value = boost::lexical_cast<double>(input); 

       if(std::cin >> input) 
       { 
        if(known_units.find(input) != known_units.end()) 
        { 
         std::cout << static_cast<double>(
          calculate(value * known_units[input])/
          known_units[output_type]) 
          << ' ' << output_type << std::endl; 
        } 
        else 
        { 
         std::cout << "Unknown unit \"" << input << "\"" 
          << std::endl; 
        } 
       } 
       else 
       { 
        break; 
       } 
      } 
      catch(...) 
      { 
       std::cout << "Input error" << std::endl; 
      } 
     } 
    } 
}