2014-11-16 3 views
0

То, что я имею в виду, я делаю программу, которая принимает параметры от пользователя (столько, сколько он хочет ввести за один раз) с помощью консоли, например.Каков правильный способ отображения объектов на C++?

-p /users/me/myFolder/myHtmlFile.html -d /users/me/myOtherFolder -n myHmtlFileStyles -r 

бы установить параметры -p, -d и -n, а затем запустить программу (потому что это то, что -r делает). Я уже написал функцию, которая проходит через каждую подстроку, окруженную пробелами во входной строке. Так что я подозреваю, что n00b шаблон дизайна будет что-то вроде

if (this_substring == "-p") 
{ 
    // ... run some procedure 
} 
else if (this_substring == "-d") 
{ 
    // ... run some procedure 
} 
else if (this_substring == "-n") 
{ 
    // ... run some procedure 
} 
else if (this_substring == "-r") 
{ 
    // ... run some procedure 
} 
else 
{ 
    // ... trigger not recognized; throw an error 
} 

, но я уверен, что есть более элегантный и правильный способ сделать это. Например, существует способ сопоставления функций string? Есть ли что-то вроде

std::map<std::string, function> triggerMap = {{"-p", function1()}, {"-d", function2()}, "-n", function3()}, {"-r", function4()}}; 

??????

ответ

0

Это зависит от того, какой стандарт вы следите. Я настоятельно рекомендую использовать C++11 (например, с недавним компилятором GCC 4.9, используя -std=c++11). Затем используйте std::function и anonymous lambdas closures.

BTW, вы можете использовать (если на Linux) glibc parsing program arguments объектов.

-1

Используйте переключатель и кучу чехлов. Определите флаги (-r, -n и т. Д.), Извлеките символ и используйте его как метку case. Не так элегантно, пожалуй, как анонимное закрытие лямбда, но более общий C++.

2

Вы можете создать std::unordered_map из строк функционировать объекты, инициализировать объект функции с лямбда и вызвать его на основе его ключа:

std::unordered_map<std::string, std::function<void()>> fns { 
    { 
     "-p", 
     []() { 
      // do stuff 
     } 
    }, 
    { 
     "-d", 
     []() { 
      // do something else 
     } 
    } 
}; 

fns[param](); 
+0

какой-либо причине вы выбрали unorderd_map над картой здесь? – stijn

+0

@stijn, так как это не похоже на то, что нам нужно заказать здесь, идиоматическое решение для поиска по ключевым словам является хеш-таблицей, которая является 'unordered_map'. –

0

Конечно, вы можете использовать указатели на функции. Но я бы рекомендовал вам использовать только Getopt

См: http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html

В вашем случае:

while ((c = getopt (argc, argv, "p:d:n:r:")) != -1) 
{ 
    switch (c) 
    { 
     case 'p': 
      function(optarg); 
      break; 
     case 'd': 
      function(optarg); 
      break; 
     case 'n': 
      function(optarg); 
      break; 
     case 'r': 
      function(optarg); 
      break; 
    } 
} 
Смежные вопросы