如何检查字符串值是否为合法类型?支持自定义类型场景
检查字符串是否为合法C++类型的便捷方法
以下是几种适配自定义类型的可行方案:
借助编译器前端工具做语法校验
利用Clang的LibTooling或LibASTMatchers工具链,将输入的字符串拼接成最小合法C++代码片段(比如using T = [输入类型];),再通过Clang编译这段临时代码,根据是否出现编译错误判断类型合法性。这种方法能原生支持内置类型、标准库类型(如std::vector<int>)和自定义类型,只要自定义类型的头文件能被正确引入编译环境。核心思路示例:
// 构造待编译的临时代码 std::string temp_code = "#include <vector>\nusing T = " + s + ";"; // 调用Clang API编译该代码,检查是否存在类型相关的编译错误维护全局类型注册表
如果是项目内部场景,可提前将所有合法类型(内置类型、标准库类型、自定义类型)的字符串表示存入全局集合,检查时直接查询即可。示例实现:
#include <unordered_set> #include <string> std::unordered_set<std::string> valid_type_names = { "int", "float", "double", "std::vector<int>", "std::string", "MyCustomClass" // 自定义类型的字符串表示 }; bool is_valid_type(const std::string& type_str) { return valid_type_names.find(type_str) != valid_type_names.end(); }这种方案性能高,但需要同步维护注册表,新增自定义类型时要更新集合内容。
利用RTTI做已有类型的匹配验证
对于已经存在实例的类型,可以通过typeid获取其类型名称,再与输入字符串做格式适配后的比对。但注意不同编译器输出的typeid名称格式可能不一致,且无法验证未实例化的类型。
内容的提问来源于stack exchange,提问作者tuk
相关产品推荐
相关产品推荐

