C ++: Что было бы подходящим решением для формирования коллекции различных типов данных? - PullRequest
0 голосов
/ 28 января 2009

Я пишу интерпретатор командной строки и пытаюсь настроить форматы для отдельных команд. У меня есть такие вещи, как имя команды, максимальное количество параметров и минимальное количество параметров. Я хочу иметь своего рода коллекцию, своего рода прототип того, что это за типы параметров. Моей первой мыслью было просто объявить вектор без шаблонов, но потом я понял, что это не Java.

Допустим, у меня есть команда типа "read test.dat 2" Я хотел бы структуру, показывающую, что типичная команда чтения имеет строку, а затем целое число.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 28 января 2009

Гетерогенный контейнер

Если вы хотите иметь контейнер, который может хранить фиксированный набор типов, вы можете использовать один из boost::variant:

typedef boost::variant<std::string, int> optval;
typedef std::vector<optval> options;

Теперь вы можете вставить push_back в вектор либо в виде строки, либо в целые числа, и вариант заметит, что он содержит:

options opts;
opts.push_back(10);
opts.push_back("hello");

Вы можете прочитать об этом в документации по Вариант повышения , в том числе о том, как получить правильное значение из варианта. Конечно, у вас также может быть карта от имен аргументов до таких вариантов, если вы уже настроили синтаксический анализ командной строки и вам больше не нужны библиотеки для этого:

std::map<std::string, optval> map;
map["--max-foo"] = 10;
map["--title"] = "something fun";

Разбор командной строки

Если вы хотите проанализировать аргументы командной строки вашей программы, вы можете обратиться к библиотеке Boost.Program Options , которая поможет вам в этом.

В основном, однако, я использую функцию posix getopt, которая также может анализировать командную строку. Я рекомендую сначала изучить параметры программы повышения, и если вы чувствуете, что он слишком тяжелый, вы можете посмотреть в getopt (см. man 3 getopt)

2 голосов
/ 28 января 2009

Мне не совсем понятно, о чем вы спрашиваете, поэтому я могу ошибаться.

Из вашего описания звучит так, как будто у вас есть абстрактное представление о командах, и что они имеют имена и ожидаемую структуру в терминах параметров. Из вашего описания звучит так, будто вам нужен список идентификаторов типов и указаний на то, являются ли они необязательными.

Затем вы можете просто создать экземпляр объекта команды для каждой команды, с которой вы собираетесь работать, и добавить их все в коллекцию команд.

Либо используйте коллекцию карт для сопоставления имен команд с реальными объектами команд. Каждый объект команды также может содержать ссылку на объект-обработчик для фактического выполнения команды.

1 голос
/ 28 января 2009

Что-то вроде этого, возможно:

enum ParameterType
{
  Int,
  String
};

struct Command
{
  string name;
  vector<ParameterType> maxParameters;
  int minParameters;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...