有没有一种方便的方法来检查字符串值是否是类型?可以有一个内置类型列表来进行比较,但这对用户定义的类型不起作用。
std::string s = "std::vector<int>";
0pizxfdo1#
在内部,不可能验证字符串是否是类型,这仅仅是因为不可能反映程序中定义了什么类型。从外部来说,如果手头没有一个完整的C编译器/解释器,就不可能判断一个给定的标记序列是否是C中的类型。
template<bool> struct A { using X = int; }; template<> struct A<false> { constexpr static auto X = []{}; }; constexpr bool some_function() { /*...*/ } int main() { A<some_function()>::X(); }
这里的A<some_function()>::X是类型还是表达式取决于some_function()在编译时的计算结果是true还是false,并且编译时语言本质上是图灵完备的(如果没有实现定义的操作数限制),需要计算几乎不受限制的C本身。更糟糕的是,甚至解析C表达式也需要相同的代码,因为任何给定的<标记的含义也可能取决于任意的编译时求值。
A<some_function()>::X
some_function()
true
false
<
wsxa1bj12#
如果只有您的计算机运行它,那么准备一个头文件,在GCC中包含如下内容:
bits/stdc++.h
然后构造一个如下的字符串(伪代码):
bool isThisType(std::string userType) { std::string toCompile = R"( #include<bits/stdc++.h> #include<listOfBuiltinTypes> int main(){ @@yourString@@ var; std::cout<<"size="<<sizeof(var); return 0; } )"; replace(toCompile,"@@yourString@@",userType); auto fileName = commandLineWriteToFile(toCompile); // main.cpp auto errorString = commandLineCompileFile(fileName); // "error.." bool isType=!commandLineCheckErrorOutput(errorString); return isType; } ... bool tmp = isThisType("std::vector<int>");
否则你就得自己做一个C++编译器了。
2条答案
按热度按时间0pizxfdo1#
在内部,不可能验证字符串是否是类型,这仅仅是因为不可能反映程序中定义了什么类型。
从外部来说,如果手头没有一个完整的C编译器/解释器,就不可能判断一个给定的标记序列是否是C中的类型。
这里的
A<some_function()>::X
是类型还是表达式取决于some_function()
在编译时的计算结果是true
还是false
,并且编译时语言本质上是图灵完备的(如果没有实现定义的操作数限制),需要计算几乎不受限制的C本身。更糟糕的是,甚至解析C表达式也需要相同的代码,因为任何给定的
<
标记的含义也可能取决于任意的编译时求值。wsxa1bj12#
如果只有您的计算机运行它,那么准备一个头文件,在GCC中包含如下内容:
然后构造一个如下的字符串(伪代码):
否则你就得自己做一个C++编译器了。