Использование gettext-подобного перевода с Boost.ProgramOptions

Я пытаюсь обеспечить 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* как описание параметра?

1

Решение

  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,

    Вы можете предоставить запрос на включение в библиотеку с обоснованием
    Сопровождающий (ы)

0

Другие решения

Других решений пока нет …