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

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

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

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

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

 thomastiger10 апр. 2014 г., 11:02
"Haunted" - хорошее описание ... Я понимаю это формально, но "странно" ...
 Oliver Charlesworth07 мая 2012 г., 19:57
Авторы Boost любят хвастаться ...

Ответы на вопрос(2)

Решение Вопроса

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

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

 Praetorian07 мая 2012 г., 21:12
@ paulrehkugler Никольотве объясняет почему
 paulrehkugler07 мая 2012 г., 21:07
+ 1 за то, как, но все же возникает вопрос: почему?

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

("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() перед всем облегчает чтение.

 paulrehkugler07 мая 2012 г., 22:08
Я подозревал, что это было единственным преимуществом. На мой взгляд, это хорошая работа, чтобы сделать красивый код.
 Vortico11 мая 2012 г., 23:56
Оба примера довольно отвратительны. Не могли бы вы определитьoptions_description_easy_init o = visible.add_options() и просто позвониo("help", "Generate this help message");?
 Nicol Bolas12 мая 2012 г., 00:27
@ Vortico: Я не вижу ничего особенно неприятного в первом случае. На самом деле, я не вижу, что ваше предложение имеет преимущество перед первым, даже если оно работает. Я не знаю, будет ли это; вам нужно проверить документацию Boost, чтобы увидеть. Но, как правило, не стоит оставлять промежуточные звенья в таких конструкциях.
 Aconcagua27 янв. 2019 г., 07:02
Не достаточноv.ao(...);?
 Nicol Bolas27 янв. 2019 г., 07:06
@ Аконкагуа: Что такоеv а такжеao? По крайней мере, с текущим синтаксисом ясно, что каждый набор символов делает что-то, связанное сadd_options. С твоими, это про символы с загадочными именами.

Ваш ответ на вопрос