1

std::stringオプションの説明として引数を提供しようとしています。一般に、有効範囲が定義されていない引数。詳しくは、翻訳を提供したいです。

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*説明パラメータとしてのみ持つ理由は何ですか?

4

1 に答える 1

0
  1. 個人的には、Boost Locale 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

    ライブラリのメンテナーに理由を添えてプル リクエストを送信することもできます。

于 2016-12-12T13:06:18.853 に答える