介绍几种使用工具

news2024/12/24 11:19:19

FileWatch,观测文件变化,源码地址:https://github.com/ThomasMonkman/filewatch
nlohmann::json,json封装解析,源码地址:https://github.com/nlohmann/json
optionparser,解析选项,源码地址:https://optionparser.sourceforge.net/

以上介绍的这三个工具都是我在学习FastDDS过程中看到的。他们的使用非常简单,都只有一个头文件。下面简单介绍一下如何使用:
FileWatch

#include <functional>
#include "FileWatch.hpp"

using FileWatchHandle = std::unique_ptr<filewatch::FileWatch<std::string>>;

void watch()
{
	std::cout << "watch" << std::endl;
}

int main()
{
	std::function<void()> callback = watch;
	(new filewatch::FileWatch<std::string>("d:\\test.txt",
		[callback](const std::string& /*path*/, const filewatch::Event change_type)
	{
		switch (change_type)
		{
		case filewatch::Event::modified:
			callback();
			break;
		default:
			// No-op
			break;
		}
	}));

	getchar();
	return 0;
}

只需要设置一个文件路径和一个回调函数,当这个文件改动时,就会触发回调函数。这个可以做一些热更新配置的功能,当配置文件变动时,无需重启软件,就能读取新的配置。
nlohmann::json

#include "json.hpp"
#include <iostream>

using Info = nlohmann::json;

int main()
{
	Info info;
	std::cout << info.size() << std::endl;
	info["a"] = "b";

	std::cout << info["a"] << std::endl;

	auto iter = info.find("a");
	if (iter == info.end()) {
		std::cout << "not found" << std::endl;
	}
	else {
		std::cout << *iter << std::endl;
	}

	std::string s = R"({
		"name" : "nick",
		"credits" : "123",
		"ranking" : 1
	})";

	auto j = nlohmann::json::parse(s);
	std::cout << j["name"] << std::endl;

	std::string ss = j.dump();
	std::cout << "ss : " << ss << std::endl;

	Info j1;
	Info j2 = nlohmann::json::object();
	Info j3 = nlohmann::json::array();

	std::cout << j1.is_object() << std::endl;
	std::cout << j1.type_name() << std::endl;

	std::cout << j2.is_object() << std::endl;
	std::cout << j2.is_array() << std::endl;

	Info infoo{
		{"name", "darren"},
		{"credits", 123},
		{"ranking", 1}
	};

	std::cout << infoo["name"] << std::endl;

	std::cout << infoo.type_name() << std::endl;

	//遍历
	for (auto iter = infoo.begin(); iter != infoo.end(); iter++) {
		std::cout << iter.key() << " : " << iter.value() << std::endl;
		//std::cout << iter.value() << std::endl;
		//std::cout << *iter << std::endl;
	}

	system("pause");
	return 0;
}

在这里插入图片描述

更多内容可以参考csdn:https://blog.csdn.net/gaoyuelon/article/details/131482372?fromshare=blogdetail
optionparser

#include "optionparser.h"

struct Arg : public option::Arg
{
	static void print_error(
		const char* msg1,
		const option::Option& opt,
		const char* msg2)
	{
		fprintf(stderr, "%s", msg1);
		fwrite(opt.name, opt.namelen, 1, stderr);
		fprintf(stderr, "%s", msg2);
	}

	static option::ArgStatus Unknown(
		const option::Option& option,
		bool msg)
	{
		if (msg)
		{
			print_error("Unknown option '", option, "'\n");
		}
		return option::ARG_ILLEGAL;
	}

	static option::ArgStatus Required(
		const option::Option& option,
		bool msg)
	{
		if (option.arg != 0 && option.arg[0] != 0)
		{
			return option::ARG_OK;
		}

		if (msg)
		{
			print_error("Option '", option, "' requires an argument\n");
		}
		return option::ARG_ILLEGAL;
	}

	static option::ArgStatus Numeric(
		const option::Option& option,
		bool msg)
	{
		char* endptr = 0;
		if (option.arg != nullptr)
		{
			strtol(option.arg, &endptr, 10);
			if (endptr != option.arg && *endptr == 0)
			{
				return option::ARG_OK;
			}
		}

		if (msg)
		{
			print_error("Option '", option, "' requires a numeric argument\n");
		}
		return option::ARG_ILLEGAL;
	}

	template<long min = 0, long max = std::numeric_limits<long>::max()>
	static option::ArgStatus NumericRange(
		const option::Option& option,
		bool msg)
	{
		static_assert(min <= max, "NumericRange: invalid range provided.");

		char* endptr = 0;
		if (option.arg != nullptr)
		{
			long value = strtol(option.arg, &endptr, 10);
			if (endptr != option.arg && *endptr == 0 &&
				value >= min && value <= max)
			{
				return option::ARG_OK;
			}
		}

		if (msg)
		{
			std::ostringstream os;
			os << "' requires a numeric argument in range ["
				<< min << ", " << max << "]" << std::endl;
			print_error("Option '", option, os.str().c_str());
		}

		return option::ARG_ILLEGAL;
	}

	static option::ArgStatus String(
		const option::Option& option,
		bool msg)
	{
		if (option.arg != 0)
		{
			return option::ARG_OK;
		}
		if (msg)
		{
			print_error("Option '", option, "' requires an argument\n");
		}
		return option::ARG_ILLEGAL;
	}

};

enum  optionIndex
{
	UNKNOWN_OPT,
	HELP,
	SAMPLES,
	INTERVAL,
	ENVIRONMENT
};

const option::Descriptor usage[] = {
	{ UNKNOWN_OPT, 0, "", "",                Arg::None,
	  "Usage: HelloWorldExample <publisher|subscriber>\n\nGeneral options:" },
	{ HELP,    0, "h", "help",               Arg::None,      "  -h \t--help  \tProduce help message." },
	{ UNKNOWN_OPT, 0, "", "",                Arg::None,      "\nPublisher options:"},
	{ SAMPLES, 0, "s", "samples",            Arg::NumericRange<>,
	  "  -s <num>, \t--samples=<num>  \tNumber of samples (0, default, infinite)." },
	{ INTERVAL, 0, "i", "interval",          Arg::NumericRange<>,
	  "  -i <num>, \t--interval=<num>  \tTime between samples in milliseconds (Default: 100)." },
	{ ENVIRONMENT, 0, "e", "env",            Arg::None,       "  -e \t--env   \tLoad QoS from environment." },
	{ 0, 0, 0, 0, 0, 0 }
};

int main(int argc, char **argv)
{
	argc -= (argc > 0);
	argv += (argc > 0); // skip program name argv[0] if present
	option::Stats stats(true, usage, argc, argv);
	std::vector<option::Option> options(stats.options_max);
	std::vector<option::Option> buffer(stats.buffer_max);
	option::Parser parse(true, usage, argc, argv, &options[0], &buffer[0]);

	try
	{
		if (parse.error())
		{
			throw 1;
		}

		if (options[HELP] || options[UNKNOWN_OPT])
		{
			throw 1;
		}

		// For backward compatibility count and sleep may be given positionally
		if (parse.nonOptionsCount() > 3 || parse.nonOptionsCount() == 0)
		{
			throw 2;
		}

		// Decide between publisher or subscriber
		const char* type_name = parse.nonOption(0);

		// make sure is the first option.
		// type_name and buffer[0].name reference the original command line char array
		// type_name must precede any other arguments in the array.
		// Note buffer[0].arg may be null for non-valued options and is not reliable for
		// testing purposes.
		if (parse.optionsCount() && type_name >= buffer[0].name)
		{
			throw 2;
		}

		if (strcmp(type_name, "publisher") == 0)
		{
			std::cout << "publisher" << std::endl;
		}
		else if (strcmp(type_name, "subscriber") == 0)
		{
			std::cout << "subscriber" << std::endl;
		}
		else
		{
			throw 2;
		}
	}
	catch (int error)
	{
		if (error == 2)
		{
			std::cerr << "ERROR: first argument must be <publisher|subscriber> followed by - or -- options"
				<< std::endl;
		}
		option::printUsage(fwrite, stdout, usage);
		return error;
	}

	getchar();
	return 0;
}

在这里插入图片描述
简单好用的工具能给我们工作带来很多便利,希望这些工具对你有用~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/962874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4.(Python数模)0-1规划

Python解决0-1规划问题 参考下面文章 源代码 import pulp # 导入 pulp 库# 主程序 def main():# 投资决策问题&#xff1a;# 公司现有 5个拟投资项目&#xff0c;根据投资额、投资收益和限制条件&#xff0c;问如何决策使收益最大。"""问题建模&#x…

9. 微积分 - 导数

文章目录 导数求导实例代码演示:迭代法求解二次函数最小值阶Hi, 大家好。我是茶桁。 我们终于结束了极限和连续的折磨,开启了新的篇章。 不过不要以为我们后面的就会很容易,只是相对来说, 没有那么绕而已。 那么,我们今天开始学习「导数」。 导数 在之前的导论,也就是…

【算法竞赛宝典】求分数精确值

【算法竞赛宝典】求分数精确值 题目描述思路讲解代码展示 题目描述 思路讲解 代码展示 //计算分数的精确值 #include<iostream>using namespace std; int remainder[101], quotient[101]; //remainder:存放除法的余数;quotient:依次存放商的每一位int main() {int m, n,…

[CISCN 2019初赛]Love Math

文章目录 前言考点解题过程 前言 感慨自己实力不够&#xff0c;心浮气躁根本做不来难题。难得这题对我还很有吸引力&#xff0c;也涉及很多知识。只能说我是受益匪浅&#xff0c;总的来说加油吧ctfer。 考点 利用php动态函数的特性利用php中的数学函数实现命令执行利用php7的特…

项目验收有哪些流程?

验收流程 科技计划项目验收/课题验收测试服务的被测对象是国家重大专项、科研课题的软件成果物&#xff0c;可以是一个模块、软件或系统等&#xff0c;也可以是软件套件或软件原型等。测试范围主要来源于课题的合同书/可行吧报告/申报书中的技术指标要求。所出具的科技项目验收…

中东 Shopify 如何使用 Bytebase 构建一站式数据库开发工作流

公司简介 Salla 是一家 2016 年成立&#xff0c;位于沙特麦加的自建站电商平台。 作为中东 Shopify&#xff0c;其最大的特点是支持阿拉伯语建站&#xff0c;并且提供更多适应中东地区特点的本地化服务。截止目前&#xff0c;已有 47,000 家店铺入驻 Salla&#xff0c;商品销售…

并发测试工具 apache-jmeter使用发送post请求JSON数据

目录 1 下载安装 2 汉化 3 创建高并发测试 配置线程组 创建web请求 创建监听器 结果树 汇总报告 为web请求添加token 添加Content-Type用于发送json 4 启动测试 5 查看结果 1 下载安装 官网Apache JMeter - Download Apache JMeter 解压运行 2 2 汉化 打开软件…

CS144环境配置问题

使用wsl来做CS144实验&#xff0c;可能会在编译的时候遇到以下问题&#xff0c;很明显是找不到LIBPCAP&#xff0c;参考链接 使用sudo apt-get install libpcap-dev命令下载该库即可。 CMake Error: The following variables are used in this project, but they are set to N…

什么是精益生产?企业如何实现精益生产?

国内的很多制造企业之所以对“精益生产”持怀疑甚至否度态度&#xff0c;大都经历过实施过程中的“水土不服”难题。抛砖引玉讲一下&#xff1a; 1、精益生产的最典型案例 1991年&#xff0c;在当时整个美国处于一种将被“日本人支配”的恐惧背景下&#xff0c;“精益生产”一…

【FPGA项目】第1个项目,来点个灯吧~

前言 你会FPGA吗&#xff1f;我会点灯&#xff01; 一、概述 作为一名点灯高手&#xff0c;今天就来实际操练一下。 如何点亮&#xff1f; 开发板上带有8个LED灯&#xff0c;我们只需要控制它对应的管脚电平输入即可。 1&#xff1a;灭&#xff1b;0&#xff1a;亮。 如何实…

大语言模型之七- Llama-2单GPU(T4 16G)微调(Fine-tune)

模型预训练colab脚本在github主页面。详见Finetuning_LLama_2_0_on_Colab_with_1_GPU.ipynb 在上一篇博客提到两种改进预训练模型性能的方法Retrieval-Augmented Generation (RAG) 或者 finetuning。本篇博客过一下模型微调。 微调&#xff1a;这是采用预训练的LLM并在较小的…

ESP8266+继电器+MQTT+VUE 实现远程开关灯

超详细教程 – ESP8266继电器MQTTVUE 实现远程开关灯 超详细教程 – ESP8266继电器MQTTVUE 实现远程开关灯 接线图 NC&#xff08;通常闭合&#xff09;与COM&#xff08;公共&#xff09;、NO&#xff08;通常开放&#xff09;与COM 是继电器引脚的不同配置&#xff0c;用于不…

JAVA实现SAP接口

JAVA实现SAP接口 环境spring-bootmaven 1.maven依赖 <dependency><groupId>com.github.virtualcry</groupId><artifactId>sapjco-spring-boot-starter</artifactId><version>3.1.4</version></dependency>2.配置文件 applic…

AI+认知行为疗法,治愈心灵的良药丨青源Workshop「AI+心理干预」观点集锦

当前&#xff0c;抑郁症、焦虑症等心理障碍成为社会关注的焦点&#xff0c;如何有效地缓解和治疗这些心理问题成为一个重要的研究方向。在这样的背景下&#xff0c;如何利用AI等先进技术手段来辅助心理疾病的治疗备受关注。例如&#xff0c;通过语音、脑部MRI辅助诊断器质性抑郁…

C++ 学习之 构造函数 和 析构函数

前言 总的来说&#xff0c;构造函数负责对象的初始化&#xff0c;而析构函数负责对象的清理和资源释放。它们是C面向对象编程中非常重要的概念&#xff0c;用于管理对象的生命周期&#xff0c;确保对象在创建和销毁时都能够正确地进行初始化和清理。 正文 看代码 class perso…

CRM如何提高销售效率?三个功能实现销售自动化

销售效率对企业的盈利能力有着至关重要的联系。提高销售效率&#xff0c;就是要提高销售人员的工作效率和销售转化率。那么&#xff0c;企业如何提高销售效率呢&#xff1f;CRM销售自动化功能可以帮助企业实现这一目标。 一、线索管理 线索是指有潜在购买意向的客户&#xff…

多目标应用:基于多目标人工蜂鸟算法(MOAHA)的微电网多目标优化调度MATLAB

一、微网系统运行优化模型 参考文献&#xff1a; [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、多目标人工蜂鸟算法MOAHA 多目标人工蜂鸟算法&#xff08;multi-objective artificial hummingbird algorithm&…

微服务-gateway鉴权

文章目录 一、前言二、gateway鉴权1、依赖配置2、编写代码3、GlobalFilter详解3.1、GlobalFilter简介3.2、GlobalFilter自定义执行顺序3.2.1、实现Order接口实现自定义执行顺序 一、前言 网关是介于客户端和服务器端之间的中间层&#xff0c;所有的外部请求都会先经过 网关这一…

Solidity 小白教程:6. 引用类型, array, struct

Solidity 小白教程&#xff1a;6. 引用类型, array, struct 这一讲&#xff0c;我们将介绍solidity中的两个重要变量类型&#xff1a;数组&#xff08;array&#xff09;和结构体&#xff08;struct&#xff09;。 数组 array 数组&#xff08;Array&#xff09;是solidity常…

【原创】H3C交换机STP协议测试

网络拓扑图 交换机信息 交换机1信息&#xff1a; <H3C>dis stp -------[CIST Global Info][Mode MSTP]-------Bridge ID : 32768.06fd-8165-0100Bridge times : Hello 2s MaxAge 20s FwdDelay 15s MaxHops 20Root ID/ERPC : 0.08c0-212c-0ff0,…