2010-09-01 12 views
15

कोई भी अपने लंबे समकक्षों के बिना बूस्ट में छोटे विकल्पों को निर्दिष्ट करने के बारे में कैसे जाएगा?केवल बूस्ट में लघु विकल्प :: program_options

(",w", po::value<int>(), "Perfrom write with N frames") 

इस

-w [ -- ] arg : Perfrom write with N frames 

कम विकल्प केवल निर्दिष्ट करने के लिए किसी भी तरह से उत्पन्न करता है?

+0

क्या आप सहायता टेक्स्ट को केवल छोटे विकल्पों को अक्षम करने के लिए चाहते हैं? –

+1

नहीं, मुझे केवल -verbose के बजाय -v दोनों को परिभाषित करने के विकल्प जैसे विकल्प चाहिए। "वी" के बजाए ", v" निर्दिष्ट करना चाल है लेकिन वर्णन की प्रिंट सूची को जोड़ता है। – Novikov

उत्तर

15

यदि आप कमांड लाइन पार्सर का उपयोग कर रहे हैं, तो विभिन्न शैलियों को सेट करने का एक तरीका है। तो समाधान केवल लंबे विकल्पों का उपयोग करना होगा और allow_long_disguise शैली को सक्षम करना होगा जो लंबे विकल्पों को एक डैश (यानी "-long_option") के साथ निर्दिष्ट करने की अनुमति देता है। यहाँ एक उदाहरण है:

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

namespace options = boost::program_options; 
using namespace std; 

int 
main (int argc, char *argv[]) 
{ 
     options::options_description desc (string (argv[0]).append(" options")); 
     desc.add_options() 
      ("h", "Display this message") 
     ; 
     options::variables_map args; 
     options::store (options::command_line_parser (argc, argv).options (desc) 
         .style (options::command_line_style::default_style | 
           options::command_line_style::allow_long_disguise) 
         .run(), args); 
     options::notify (args); 
     if (args.count ("h")) 
     { 
      cout << desc << endl; 
      return 0; 
     } 
} 

हालांकि वर्णन उत्पादन के साथ एक छोटे से समस्या हो जाएगा:

$ ./test --h 
./test options: 
    --h     Display this message 

और वह एक है क्योंकि यह है कि क्या इस उत्पादन बनाने के लिए इस्तेमाल किया जा रहा है ठीक करने के लिए मुश्किल है:

std::string 
option_description::format_name() const 
{ 
    if (!m_short_name.empty()) 
     return string(m_short_name).append(" [ --"). 
     append(m_long_name).append(" ]"); 
    else 
     return string("--").append(m_long_name); 
} 

दिमाग में आने वाला एकमात्र फिक्स परिणामस्वरूप स्ट्रिंग में "-" के साथ बदल रहा है। उदाहरण के लिए:

#include <iostream> 
#include <sstream> 
#include <boost/program_options.hpp> 
#include <boost/algorithm/string/replace.hpp> 

namespace options = boost::program_options; 
using namespace std; 

int 
main (int argc, char *argv[]) 
{ 
     options::options_description desc (string (argv[0]).append(" options")); 
     desc.add_options() 
      ("h", "Display this message") 
     ; 
     options::variables_map args; 
     options::store (options::command_line_parser (argc, argv).options (desc) 
         .style (options::command_line_style::default_style | 
           options::command_line_style::allow_long_disguise) 
         .run(), args); 
     options::notify (args); 
     if (args.count ("h")) 
     { 
      std::stringstream stream; 
      stream << desc; 
      string helpMsg = stream.str(); 
      boost::algorithm::replace_all (helpMsg, "--", "-"); 
      cout << helpMsg << endl; 
      return 0; 
     } 
} 

सबसे अच्छी बात आप कर सकते हैं कोड जहां यह प्रिंट खाली लंबे विकल्प का वर्णन ठीक करने और पुस्तकालय के लेखक को एक पैच भेजने के लिए है।

+0

बहुत अंतर्दृष्टि, धन्यवाद! – Novikov

+1

@ नोविकोव आपका स्वागत है। एफवाईआई - मैंने अभी आपके मुद्दे के लिए टिकट बनाया है और आंशिक रूप से उस प्रारूप_नाम() फ़ंक्शन को ठीक किया है। Https://svn.boost.org/trac/boost/ticket/4644 देखें –

संबंधित मुद्दे