實現運行時根據用戶輸入的函數名或代碼行號,動態調用對應函數並支持循環執行。
構建 函數名/行號 → 函數指針 的映射關係,運行時查表調用。
#include <iostream>
#include <string>
#include <unordered_map>
#include <functional>
#include <vector>
// 示例業務函數
void taskA() { std::cout << "執行任務 A\n"; }
void taskB() { std::cout << "執行任務 B\n"; }
void taskC() { std::cout << "執行任務 C\n"; }
// 函數註冊表
std::unordered_map<std::string, std::function<void()>> funcMap = {
{"taskA", taskA},
{"taskB", taskB},
{"taskC", taskC},
{"1", taskA}, // 支持行號別名
{"2", taskB},
{"3", taskC}
};
// 也可用結構體支持更多元數據
struct FuncInfo {
std::function<void()> func;
std::string desc;
int line; // 模擬行號
};
std::unordered_map<std::string, FuncInfo> funcRegistry;
void registerFunctions() {
funcRegistry["taskA"] = {taskA, "數據清洗", 10};
funcRegistry["taskB"] = {taskB, "特徵提取", 25};
funcRegistry["taskC"] = {taskC, "模型訓練", 40};
}
void executeByName(const std::string& name) {
auto it = funcRegistry.find(name);
if (it != funcRegistry.end()) {
std::cout << "[" << it->second.line << "] " << it->second.desc << ": ";
it->second.func();
} else {
std::cout << "未找到函數: " << name << "\n";
}
}
void executeLoop(const std::vector<std::string>& names, int cycles) {
for (int i = 0; i < cycles; ++i) {
std::cout << "=== 第 " << (i+1) << " 輪 ===\n";
for (const auto& name : names) {
executeByName(name);
}
}
}
int main() {
registerFunctions();
// 單次調用
executeByName("taskB");
// 循環執行指定序列
std::vector<std::string> pipeline = {"taskA", "taskB", "taskC"};
executeLoop(pipeline, 2);
// 交互式輸入
std::string input;
std::cout << "輸入函數名執行 (q 退出): ";
while (std::cin >> input && input != "q") {
executeByName(input);
std::cout << "輸入函數名執行 (q 退出): ";
}
return 0;
}
| 需求 | 實現方案 | 關鍵技術 |
|---|---|---|
| 帶參數函數調用 | 統一接口 void(void*) + 參數結構體 | 類型擦除、變參模板 |
| 行號精確映射 | 編譯期 __LINE__ 宏 + 註冊宏 | 宏元編程、__COUNTER__ |
| 插件化動態加載 | 動態庫 dlopen/LoadLibrary + 符號查找 | 共享庫、C 接口導出 |
| 調試器級控制 | 集成 libdw/DbgHelp 解析 DWARF/PDB | 調試信息解析、源碼映射 |
#define REGISTER_FUNC(name, desc) \
namespace { \
struct Register_##name { \
Register_##name() { \
funcRegistry[#name] = {name, desc, __LINE__}; \
} \
} reg_##name; \
}
void myFunction() { ... }
REGISTER_FUNC(myFunction, "自定義業務邏輯") // 自動註冊
std::function 有微小開銷,極高頻調用可改用原始函數指針 void(*)()。通過函數指針映射表配合 std::function 實現動態分發,是 C++ 實現「按名/行號調用」的標準、高效且可擴展方案。