2011-02-24 53 views
5

我使用boost程序选项从命令行参数中获取布尔值。我想指定我的说法是“Y”,是的”,‘N’,‘否’。来自boost程序选项的布尔选项

其实我的代码,这样做是使用临时字符串

  1. boost program options
  2. 解析
  3. 核对“Y”,“是”,“N”或“否”
  4. 指定到布尔变量成员。

最重要的是我还使用另一个临时串获取默认值。

我做了所有的工作,因为我想你的代码下面,没有工作

 namespace pod = boost::program_options; 

     ("Section.Flag", 
      pod::value<bool>(&myFlag_bool)->default_value(false), 
      "description") 

你知道提升程序选项是否可以使用一些更好的那么一个我用它来实现这一目标?

回答

4

您将以某种方式解析字符串。有几个选项,主要取决于你将多久查询一次这个值。这是一个类似于我最近使用的例子; CopyConstructable和Assignable,因此它可以很好地与STL配合使用。我想,我需要做一些额外的东西,让它使用program_options工作,但你得到的要点:

#include <boost/algorithm/string.hpp> 

class BooleanVar 
{ 
public: 
    BooleanVar(const string& str) 
     : value_(BooleanVar::FromString(str)) 
    { 
    }; 

    BooleanVar(bool value) 
     : value_(value) 
    { 
    }; 

    BooleanVar(const BooleanVar& booleanVar) 
     : value_(booleanVar) 
    { 
    }; 

    operator bool() 
    { 
     return value_; 
    }; 

    static bool FromString(const string& str) 
    { 
     if (str.empty()) { 
      return false; 
     } 

     // obviously you could use stricmp or strcasecmp(POSIX) etc if you do not use boost 
     // or even a heavier solution using iostreams and std::boolalpha etc 
     if (
      str == "1" 
      || boost::iequals(str, "y") 
      || boost::iequals(str, "yes") 
      || boost::iequals(str, "true") 
     ) 
     { 
      return true; 
     } 

     return false; 
    }; 

protected: 
    bool value_; 
}; 
+0

感谢您的答复和提升的使用:: iequals..I从来没有想过这个问题。问候AFG – 2011-02-27 10:25:54

+1

@Abruzzo如果这个答案解决了你的问题,你应该接受它。 – 2011-03-03 04:07:34