tclap库的使用

这是一个C++ 命令行解析库,通过使用 tclap 库,可以自定义命令行参数,最终运行程序时解析出来。

下载地址:https://tclap.sourceforge.net/

文档地址:https://tclap.sourceforge.net/html/classTCLAP_1_1ValueArg.html#abcfd865f772d3fd26cdbe4d8112b3722

安装

解压后把include目录复制到 usr/local/tclp 目录下即可使用,因为只有头文件

1 tar -xzvf tclap-1.2.5.tar.gz
2 cd tclap-1.2.5
3 cd include
4 sudo cp -r tclap/ /usr/local/include/

 

使用方法:

 1 #include <iostream>
 2 #include <sstream>
 3 #include <tclap/CmdLine.h>
 4 using namespace std;
 5 using namespace TCLAP;
 6 
 7 template <class Type>  
 8 Type stringToNum(const std::string& str){  
 9     istringstream iss(str);  
10     Type num;  
11     iss >> num;  
12     return num;      
13 } 
14 
15 int main(int argc, char* argv[])
16 {
17     /*
18         第二个参数表示命令行参数之间用的分隔符,默认是空格
19         第三个参数设置版本,使用 --version 可显示结果
20         第四个参数表示是否创建Help信息,默认为true,使用-h或者--help即可展示
21     */
22     CmdLine cmd("this is description message", ' ', "0.1", true); //创建命令行解释器
23     /*    
24         创建命令行参数
25         第一个参数是短标识,即[-n 参数],第二个参数则是长标识,即[--name 参数],第三个参数是该命令行参数的说明,
26         第四个参数表示该命令行参数是否必须设置,第五个参数表示该命令行参数的默认值,第六个参数说明该命令行参数的
27         数据类型,只是在help信息中做展示使用
28     */
29     ValueArg<std::string> nameArg("n", "name", "Name to print", false, "Tom", "std::string" );  // Tom is the default value
30 
31     ValueArg<int> deviceIdArg("c", "cam", "Camera device id", false, 123, "integer" ); // 33 is the default value
32 
33     ValueArg<double> deviceDataArg("d", "data", "data user defined", false, 2.3456, "double" ); // 33 is the default value
34 
35     ValueArg<std::string> initBbArg("b", "boundingbox", "Init Bounding Box", false, "-1,-1,-1,-1", "x,y,w,h"); 
36     cmd.add(nameArg); //向命令行解释器添加命令行参数
37     cmd.add(deviceIdArg);
38     cmd.add(deviceDataArg);
39     cmd.add(initBbArg);
40     cmd.parse(argc, argv);//解析命令行参数
41     std::string name = nameArg.getValue(); //获得该命令行参数的值
42     std::cout << "My name is: " << name << std::endl;
43 
44     int camId = deviceIdArg.getValue();
45     std::cout << "Camera ID is: " << camId << std::endl;
46 
47     double data = deviceDataArg.getValue();
48     std::cout << "data is: " << data << std::endl;
49 
50     std::stringstream initBbSs(initBbArg.getValue());
51     double initBb[4];
52     for (int i = 0; i < 4; ++i)
53     {
54         std::string singleValueStr;
55         getline(initBbSs, singleValueStr, ',');
56         initBb[i] = stringToNum<double>(singleValueStr);
57     }
58     std::cout << "initBb : " << initBb[0] << " " << initBb[1] << " " << initBb[2] << " " << initBb[3] << std::endl;
59  
60     return 0;
61 }

 

结果:

 1 $ ./test  //未设置命令行参数,按默认值输出
 2 My name is: Tom
 3 Camera ID is: 123
 4 data is: 2.3456
 5 initBb : -1 -1 -1 -1
 6 
 7 $ ./test -n zzqi -c 99 -d 3.5 -b 2,4,6,1  //设置了命令行参数,都会按照设置的值进行输出
 8 My name is: zzqi
 9 Camera ID is: 99
10 data is: 3.5
11 initBb : 2 4 6 1
12 
13 $ ./test --version
14 ./test  version: 0.1
15     
16     
17 $ ./test -h
18 USAGE: 
19 
20    ./test  [-b <x,y,w,h>] [-d <double>] [-c <integer>] [-n <std::string>]
21            [--] [--version] [-h]
22 
23 
24 Where: 
25 
26    -b <x,y,w,h>,  --boundingbox <x,y,w,h>
27      Init Bounding Box
28 
29    -d <double>,  --data <double>
30      data user defined
31 
32    -c <integer>,  --cam <integer>
33      Camera device id
34 
35    -n <std::string>,  --name <std::string>
36      Name to print
37 
38    --,  --ignore_rest
39      Ignores the rest of the labeled arguments following this flag.
40 
41    --version
42      Displays version information and exits.
43 
44    -h,  --help
45      Displays usage information and exits.
46 
47 
48    this is description message

 

 

 

 

posted @ 2023-01-02 16:45  烛爻  阅读(677)  评论(0编辑  收藏  举报