c++ 如何检查字符串值是否为类型?

pw136qt2  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(158)

有没有一种方便的方法来检查字符串值是否是类型?
可以有一个内置类型列表来进行比较,但这对用户定义的类型不起作用。

std::string s = "std::vector<int>";
0pizxfdo

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
表达式也需要相同的代码,因为任何给定的<标记的含义也可能取决于任意的编译时求值。

wsxa1bj1

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++编译器了。

相关问题