Вопрос по c++ – Параметры программы Boost Добавить параметры Синтаксис

21

Я пишу программу, которая использует библиотеку параметров программы Boost, и я заметил следующий синтаксис, который преследовал меня с тех пор, как я его увидел:

<code>desc.add_options()
        ("help","produce help message")
        ( /* other flag, value, description pairs here */)
;
</code>

Я вижу, что в заголовке operator () переопределен, но я не уверен, как это позволяет синтаксически корректно это делать.

Во-вторых, есть ли какое-то преимущество в этом синтаксисе по сравнению с простым вызовом add_options () несколько раз (помимо демонстрации того факта, что вы можете манипулировать синтаксисом, подобным этому)?

Авторы Boost любят хвастаться ... Oliver Charlesworth
"Haunted" - хорошее описание ... Я понимаю это формально, но "странно" ... thomastiger

Ваш Ответ

2   ответа
18

add_optionsункция-член возвращает объект типаoptions_description_easy_init. Последний имеетoperator() перегружен, чтобы вернуть ссылку на себя. Это позволяет объединять вызовы, как показано в фрагменте.

Разница между цепочкой звонков и звонкомadd_options несколько раз, что в первом случае один экземплярoptions_description_easy_init создается и каждый раз, когда вы вызываетеoperator() на нем, он добавляет опции владельцу options_description). Если бы вы позвонилиadd_options несколько раз каждый вызов создаст новый экземплярoptions_description_easy_init.

+ 1 за то, как, но все же возникает вопрос: почему? paulrehkugler
@ paulrehkugler Никольотве объясняет почему Praetorian
12

Сравните это с одним из моих домашних проектов:

("help,h", "Generate this help message")
("output-file,o", po::value<std::string>(), "Output filename. Required.")
("tangent,t", "Generate/load tangent-space basis.")
("collada-output,c", "Write a Collada file, rather than our mesh XML format.")
("arrays,a", "Write arrays instead of indexed verts. Cannot combine with Collada writing.")
("flip-tangent,f", "Change the tangent-space basis matrix's handedness. Negates bitangent.")
("map", po::value<std::string>(), "Map filename. Defaults to the ColladaConv directory's 'stdmap.txt' file.")
("vao", po::value<std::vector<std::string> >(), "Sequence of mappings, of the form:\n"
        "Name # # # #\n"
        "\n"
        "Each # is an attribute index to use for this VAO.\n"
        "Each VAO name must be unique; you cannot use the same VAO in the same place.")

к этому

visible.add_options()("help,h", "Generate this help message")
visible.add_options()("output-file,o", po::value<std::string>(), "Output filename. Required.")
visible.add_options()("tangent,t", "Generate/load tangent-space basis.");
visible.add_options()("collada-output,c", "Write a Collada file, rather than our mesh XML format.");
visible.add_options()("arrays,a", "Write arrays instead of indexed verts. Cannot combine with Collada writing.");
visible.add_options()("flip-tangent,f", "Change the tangent-space basis matrix's handedness. Negates bitangent.");
visible.add_options()("map", po::value<std::string>(), "Map filename. Defaults to the ColladaConv directory's 'stdmap.txt' file.");
visible.add_options()("vao", po::value<std::vector<std::string> >(), "Sequence of mappings, of the form:\n"
        "Name # # # #\n"
        "\n"
        "Each # is an attribute index to use for this VAO.\n"
        "Each VAO name must be unique; you cannot use the same VAO in the same place.");

лина @Line имеет значение. И не обязательно иметьvisible.add_options() перед всем облегчает чтение.

Я подозревал, что это было единственным преимуществом. На мой взгляд, это хорошая работа, чтобы сделать красивый код. paulrehkugler
Оба примера довольно отвратительны. Не могли бы вы определитьoptions_description_easy_init o = visible.add_options() и просто позвониo("help", "Generate this help message");? Vortico
@ Vortico: Я не вижу ничего особенно неприятного в первом случае. На самом деле, я не вижу, что ваше предложение имеет преимущество перед первым, даже если оно работает. Я не знаю, будет ли это; вам нужно проверить документацию Boost, чтобы увидеть. Но, как правило, не стоит оставлять промежуточные звенья в таких конструкциях. Nicol Bolas
Не достаточноv.ao(...);? Aconcagua
@ Аконкагуа: Что такоеv а такжеao? По крайней мере, с текущим синтаксисом ясно, что каждый набор символов делает что-то, связанное сadd_options. С твоими, это про символы с загадочными именами. Nicol Bolas

Похожие вопросы