你将扮演一个高级AI C++导师。你的任务是根据我提供的学习主题和测试策略,生成一个完整的、自包含的C++互动学习文件。这个文件必须实现自动化的、循序渐进的测试流程,让学习者无需任何手动配置即可开始编码挑战。
你的工作将遵循以下三个核心部分:
- TestHelper.h 知识库: 你必须完全理解并使用下面提供的 TestHelper.h (v3.8) 的全部功能。这是你生成代码的底层框架。
- 生成器指令集 (V4.0): 你必须严格遵守下面列出的详细生成规则。这是你的行动蓝图。
- 用户请求: 最后,你将根据我给出的具体主题和策略来执行生成任务。
第一部分:TestHelper.h 知识库
cpp
// ================================================================================
// 文件名: TestHelper.h (v3.8 - 添加对 std::array 的 toString 支持)
// 描述: 一个为互动学习设计的、支持两种测试策略(预定义用例和官方解对比)
// 并能自动解锁任务的C++测试框架。
// ================================================================================
#ifndef TEST_HELPER_H
#define TEST_HELPER_H
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <tuple>
#include <utility>
#include <type_traits>
#include <array> // 新增! 为 std::array 的 toString 支持
namespace TestHelper {
// --- ANSI 颜色码定义 ---
#define RESET_COLOR "\033[0m"
#define RED_COLOR "\033[31m"
#define GREEN_COLOR "\033[32m"
#define YELLOW_COLOR "\033[33m"
#define BLUE_COLOR "\033[34m"
#define MAGENTA_COLOR "\033[35m"
#define CYAN_COLOR "\033[36m"
#define BOLD_TEXT "\033[1m"
#define UNDERLINE_TEXT "\033[4m"
// --- 内部状态变量 ---
static int test_count = 0;
static int passed_count = 0;
// --- 漂亮的类型到字符串转换器 (内部使用) ---
template<typename T>
std::string toString(const T& val) {
std::ostringstream oss;
oss << val;
return oss.str();
}
template<> inline std::string toString<int>(const int& val) { return std::to_string(val); }
template<> inline std::string toString<size_t>(const size_t& val) { return std::to_string(val); }
template<> inline std::string toString<double>(const double& val) { return std::to_string(val); }
template<> inline std::string toString<float>(const float& val) { return std::to_string(val); }
template<> inline std::string toString<char>(const char& val) { std::string s; s += "'"; s += val; s += "'"; return s; }
template<> inline std::string toString<bool>(const bool& val) { return val ? "true" : "false"; }
template<> inline std::string toString<std::string>(const std::string& val) { return "\"" + val + "\""; }
template<typename T>
std::string toString(const std::vector<T>& vec) {
std::ostringstream oss;
oss << "{";
for (size_t i = 0; i < vec.size(); ++i) {
oss << toString(vec[i]);
if (i < vec.size() - 1) oss << ", ";
}
oss << "}";
return oss.str();
}
// ✨✨✨ 新增的修复代码 ✨✨✨
// 为 std::array 添加 toString 支持
template<typename T, size_t N>
std::string toString(const std::array<T, N>& arr) {
std::ostringstream oss;
oss << "{";
for (size_t i = 0; i < arr.size(); ++i) {
oss << toString(arr[i]); // 递归调用,支持嵌套数组
if (i < arr.size() - 1) oss << ", ";
}
oss << "}";
return oss.str();
}
namespace detail {
template<typename Tuple, size_t I>
void print_tuple_element(std::ostringstream& oss, const Tuple& t) {
if constexpr (I > 0) {
oss << ", ";
}
oss << TestHelper::toString(std::get<I>(t));
}
template<typename Tuple, size_t... Is>
void print_tuple_elements(std::ostringstream& oss, const Tuple& t, std::index_sequence<Is...>) {
(print_tuple_element<Tuple, Is>(oss, t), ...);
}
}
template<typename... Args>
std::string toString(const std::tuple<Args...>& t) {
std::ostringstream oss;
oss << "(";
detail::print_tuple_elements(oss, t, std::make_index_sequence<sizeof...(Args)>());
oss << ")";
return oss.str();
}
// --- 核心测试函数 (单个) ---
template<typename T>
void runTestCase(const std::string& testName, const T& actual, const T& expected) {
test_count++;
std::cout << testName << std::endl;
if (actual == expected) {
passed_count++;
std::cout << GREEN_COLOR " ✅ PASSED" RESET_COLOR << std::endl;
} else {
std::cout << RED_COLOR " ❌ FAILED" RESET_COLOR << std::endl;
std::cout << " Expected: " << toString(expected) << std::endl;
std::cout << " Actual: " << toString(actual) << std::endl;
}
std::cout << std::endl;
}
// --- 测试总结 ---
void printTestSummary() {
std::cout << BOLD_TEXT "================== 任务总结 ==================" RESET_COLOR << std::endl;
std::cout << " 总计通过测试: " << passed_count << " / " << test_count << std::endl;
if (test_count > 0 && passed_count == test_count) {
std::cout << GREEN_COLOR BOLD_TEXT " 评级: 完美!你真是个编程天才!✨" RESET_COLOR << std::endl;
} else if (test_count > 0 && passed_count > 0) {
std::cout << YELLOW_COLOR " 评级: 太棒了,离成功仅一步之遥!" RESET_COLOR << std::endl;
} else if (test_count > 0) {
std::cout << RED_COLOR " 评级: 别灰心,伟大的冒险才刚刚开始!" RESET_COLOR << std::endl;
}
std::cout << BOLD_TEXT "================================================" RESET_COLOR << std::endl;
}
template <typename... Args, typename Tuple, size_t... Is>
std::tuple<Args...> extract_tuple_args_impl(const Tuple& t, std::index_sequence<Is...>) {
return std::make_tuple(std::get<Is>(t)...);
}
template <typename... Args, typename Tuple>
std::tuple<Args...> extract_tuple_args(const Tuple& t) {
return extract_tuple_args_impl<Args...>(t, std::make_index_sequence<sizeof...(Args)>());
}
// ✨ 模式1: 自动解锁的任务运行器 (预定义用例) ✨
template <typename SolutionClass, typename ReturnType, typename... Args>
bool runTaskAndCheckSuccess(
SolutionClass& solver,
ReturnType (SolutionClass::*func)(Args...),
const std::vector<std::tuple<std::decay_t<Args>..., ReturnType>>& test_cases,
const std::string& taskTitle)
{
std::cout << "\n" BOLD_TEXT "--- " << taskTitle << " ---" RESET_COLOR << std::endl;
if (test_cases.empty()) { std::cout << " (没有为此任务提供测试用例)" << std::endl; return true; }
int cases_in_task = test_cases.size();
int passed_before_task = passed_count;
int total_before_task = test_count;
int test_num = 1;
for (const auto& test_case : test_cases) {
auto extracted_args = extract_tuple_args<Args...>(test_case);
auto expected = std::get<sizeof...(Args)>(test_case);
auto actual = std::apply([&](auto&&... args) {
return (solver.*func)(std::forward<decltype(args)>(args)...);
}, extracted_args);
runTestCase(" 预设测试 #" + std::to_string(test_num++), actual, expected);
}
int passed_in_task = passed_count - passed_before_task;
if (passed_in_task == cases_in_task) {
std::cout << GREEN_COLOR "✨ 任务完成! 已自动解锁下一关...\n" RESET_COLOR;
return true;
} else {
std::cout << RED_COLOR "❌ 挑战尚未完成。请修正以上错误后重试。\n" RESET_COLOR;
std::cout << YELLOW_COLOR ">>> 后续挑战已暂停,等你凯旋!\n" RESET_COLOR;
return false;
}
}
// ✨ 模式2: 自动解锁的任务运行器 (与官方解对比) ✨
template <typename UserSolution, typename OfficialSolution, typename ReturnType, typename... Args>
bool runTaskWithOfficialAndCheckSuccess(
UserSolution& user_solver,
OfficialSolution& official_solver,
ReturnType (UserSolution::*user_func)(Args...),
ReturnType (OfficialSolution::*official_func)(Args...),
const std::vector<std::tuple<std::decay_t<Args>...>>& test_inputs,
const std::string& taskTitle)
{
std::cout << "\n" BOLD_TEXT "--- " << taskTitle << " ---" RESET_COLOR << std::endl;
if (test_inputs.empty()) { std::cout << " (没有为此任务提供动态测试输入)" << std::endl; return true; }
int cases_in_task = test_inputs.size();
int passed_before_task = passed_count;
int total_before_task = test_count;
int test_num = 1;
for (const auto& inputs : test_inputs) {
auto expected = std::apply([&](auto&&... args){ return (official_solver.*official_func)(std::forward<decltype(args)>(args)...); }, inputs);
auto actual = std::apply([&](auto&&... args){ return (user_solver.*user_func)(std::forward<decltype(args)>(args)...); }, inputs);
runTestCase(" 动态测试 #" + std::to_string(test_num++), actual, expected);
}
int passed_in_task = passed_count - passed_before_task;
if (passed_in_task == cases_in_task) {
std::cout << GREEN_COLOR "✨ 任务完成! 已自动解锁下一关...\n" RESET_COLOR;
return true;
} else {
std::cout << RED_COLOR "❌ 挑战尚未完成。请修正以上错误后重试。\n" RESET_COLOR;
std::cout << YELLOW_COLOR ">>> 后续挑战已暂停,等你凯旋!\n" RESET_COLOR;
return false;
}
}
}
#endif // TEST_HELPER_H¶
第二部分:生成器指令集 (V4.0)
1. 任务分析与课程设计:
- 接收用户指定的C++主题,自主设计3到5个循序渐进的子任务,覆盖该主题的核心基础知识点,难度中等偏上;每个任务都应被包装成一个微型的、有上下文的实际问题(如“日志文件分析”、“游戏得分计算”、“配置解析”),而不是纯粹的语法练习;任务所操作的数据类型不应仅限于基础类型。
- 为每个任务构思一个简洁的标题、详细的任务描述、配备详尽的知识点解析和函数用法示例、主要应用场景、一个生动有趣的“探险家提示”以及若干测试用例。
2. 文件结构与内容:
- 文件名: l1-1-1_[主题小写].cpp。格式为[章节]-[模块]-[小节]_[主题小写].cpp
- 头部注释: 包含文件名、主题和所选的测试策略。
- 头文件: 默认包含
<iostream>, <vector>, <string>
, "TestHelper.h"。根据任务需要智能添加其他头文件(如<algorithm>, <numeric>, <set>, <map>
等)。 - Solution 类: 为每个设计的任务创建公有成员函数。每个函数必须有可编译的占位符实现(例如 return 0;, return {};)。在函数上方用 /** ... */ 注释块提供 🚀 你的任务 描述。
3. 测试策略实施:
- 'Official Solution' 策略 (高阶任务推荐):
- 生成 Solution_Official 类,包含所有任务的完整、优雅的实现。
- 在 runAllTasks 中,创建仅包含输入参数的 std::vector<std::tuple<...>>。
- 使用 TestHelper::runTaskWithOfficialAndCheckSuccess() 进行测试。
- 'Predefined Cases' 策略:
- 在 runAllTasks 中,创建包含所有输入参数和预期输出的 std::vector<std::tuple<...>>。
- 使用 TestHelper::runTaskAndCheckSuccess() 进行测试。
4. 自动化测试流程:
- 在 main 函数之外创建 void runAllTasks(Solution& solver) 函数。
- 在 runAllTasks 函数内部,为每个任务按顺序构建测试块。
- 每个测试块必须先打印“探险家提示”。
- 每个测试块的核心是 if (!TestHelper::...(...)) return; 语句。这个“责任链”结构确保了只有在当前任务完全通过时,才会继续测试下一个任务。
- 在 runAllTasks 函数的末尾,如果所有任务都通过了,打印一条最终的祝贺信息。
5. main 函数:
- 保持简洁。创建 Solution 实例,打印欢迎语,调用 runAllTasks,最后调用 TestHelper::printTestSummary()。
6. 文件结构模板
Generated cpp
cpp
// ================================================================================
// 文件名: l1-1-1_[主题小写].cpp
// 主题: [主题] 进阶之路 (策略: [所选策略])
// ================================================================================
#include "../TestHelper.h"
#include <iostream>
#include <vector>
// ... 其他必要头文件 ...
class Solution {
public:
// --- 任务 1: [任务1标题] ---
/**
* 🚀 你的任务
* [任务1详细描述]
*/
[返回类型] [函数名1]([参数]) { return [默认值]; }
// --- 任务 2: [任务2标题] ---
/**
* 🚀 你的任务
* [任务2详细描述]
*/
[返回类型] [函数名2]([参数]) { return [默认值]; }
// ... 其他任务 ...
};
// [如果策略是 'Official Solution',则在此处插入 Solution_Official 类]
#if [CONDITION_FOR_OFFICIAL_SOLUTION]
class Solution_Official {
public:
// --- 官方解 1 ---
[返回类型] [函数名1]([参数]) {
// [任务1的正确、完整实现]
}
// ... 其他官方解 ...
};
#endif
// ================================================================================
// 测试区域
// ================================================================================
void runAllTasks(Solution& solver) {
// [如果策略是 'Official Solution',在此处创建 official_solver 实例]
#if [CONDITION_FOR_OFFICIAL_SOLUTION]
Solution_Official official_solver;
#endif
// ----------- 任务 1 -----------
std::cout << "💡 探险家提示: [任务1的生动提示]" << std::endl;
// [根据策略生成测试用例 (带输出或不带输出)]
// [根据策略调用 runTaskAndCheckSuccess 或 runTaskWithOfficialAndCheckSuccess]
// if (!TestHelper::...(...)) return;
// ----------- 任务 2 -----------
std::cout << "💡 探险家提示: [任务2的生动提示]" << std::endl;
// [任务2的测试用例和调用]
// if (!TestHelper::...(...)) return;
// ... 后续任务 ...
std::cout << "\n🎉🎉🎉 恭喜你!你已完成本模块所有挑战! 🎉🎉🎉\n";
}
int main() {
Solution solver;
std::cout << "=============== [主题] 进阶之路 开始 ===============\n";
runAllTasks(solver);
TestHelper::printTestSummary();
return 0;
}
第三部分:用户请求
主题: std::vector
测试策略: 自行选择
现在,请开始生成 l1-1-1_vector.cpp 文件。