🎯 用 C++ 手写一个音视频工具的命令行骨架:参数解析 + 任务回调系统
一、为什么需要这个框架?
你可能用过 ffmpeg、handbrake-cli 这类命令行音视频工具,它们支持这样的命令:
./mytool –input video.mp4 –output out.mp4 transcode
背后其实有两件事要做:
如果每次加新功能都硬编码 if-else,代码会越来越乱。 所以,我们需要一个可扩展的命令分发系统——这正是本文要实现的。
二、整体设计思路
我们用两个核心机制:
| 参数回调注册 | 告诉程序\”看到 –input 就调这个函数\” |
| 任务回调注册 | 告诉程序\”看到 transcode 就执行转码逻辑\” |
底层靠两个 std::map 实现:
- map<string, function> 存参数处理器
- map<string, function> 存任务处理器
核心优势:新增参数或任务,只需注册一行代码,无需修改解析逻辑。
三、完整可运行代码(三个文件)
📄 文件 1:UserInput.h —— 接口声明
#ifndef USER_INPUT_H
#define USER_INPUT_H
#include <string>
#include <vector>
#include <map>
#include <functional>
#include <iostream>
class UserInput {
public:
// 给\”带字符串参数的函数\”起个别名
using ParaCall = std::function<void(const std::string&)>;
// 给\”字符串列表引用\”起个别名
using ParaVec = const std::vector<std::string>&;
// 参数回调表:如 \”–input\” -> 处理函数
std::map<std::string, ParaCall> para_keys_;
// 任务回调表:如 \”transcode\” -> 转码函数
std::map<std::string, std::function<void(ParaVec)>> main_tasks_;
// 注册参数处理函数
void RegParam(const std::string& key, ParaCall func);
// 注册主任务函数
void RegTask(const std::


