2016-12-11 130 views
1

我試圖提供std::string參數作爲選項的描述。一般而言,一個論點的範圍並沒有被界定。詳細地說,我想提供翻譯。與Boost.ProgramOptions一起使用gettext-like翻譯

using namespace boost::program_options; 
using namespace boost::locale; 

options_description desc (translate ("Hello world!")); 
desc.add_options() 
    ("help", translate ("Veni vidi vici")) 
; 

add_options()返回options_description_easy_init實例哪個預限定()操作者,這樣就可以使用上述的語法。現在,該運營商只接受const char*作爲說明,這讓我感到困惑。因此我有以下幾個問題:

  1. 什麼可以解決這個問題?
  2. 這個班的所有制政策是什麼?難道這些指針只存儲,因此源,應該住不亞於描述生活或它是安全的(呸!):

    ("help", translate ("Veni vidi vici").str().c_str()) 
    
  3. 什麼是僅具有const char_type*作爲描述參數的合理性?

+0

1個問題拉入請求問) – sehe

回答

0
  1. 你的名字,我個人會建議加速區域設置http://www.boost.org/doc/libs/1_61_0/libs/locale/doc/html/messages_formatting.html但也許你已經這樣做了

  2. 如果沒有形成文件,你可以假設該字符串被複制。還有什麼會是一個(文檔)錯誤

    這不是太難檢查代碼option_description,看看這確實是這使得它明顯的編譯器允許的情況下

    std::string m_short_name, m_long_name, m_description; 
    // shared_ptr is needed to simplify memory management in 
    // copy ctor and destructor. 
    shared_ptr<const value_semantic> m_value_semantic; 
    
  3. 任何C風格的字符串/文字,同時向用戶記錄嵌入的NUL字符是不可能的(暗示你不能使用UCS2或類似的)。除此之外,我同意將正式參數聲明爲std::string會更加乾淨。

    你可能會在同一時間[請](https://stackoverflow.com/help/提供與推理庫 維護者(S)

+0

我真的不喜歡'translate(「abc」)。str()。c_str()'方法。由於設計更改,我將使用'msg.c_str()'來運行。至於基本原理 - 'const char *'阻止了許多錯誤(例如使用'\ b'等)。我看不到推理。這就是說,我很欣賞你的答案 - 謝謝你。 – Rado

+0

就像我說過的,你有一個點,你可以把它與開發者。我相信他們歡迎提供意見。反正你的問題也是關於安全。這很安全,我回答了_that_。 – sehe