c++ typeid().name()和consteval函数问题

6jygbczu  于 2023-04-01  发布在  其他
关注(0)|答案(2)|浏览(121)

我正在使用MSVC 19,在编译以下代码时出错。有没有办法在consteval函数中获取对象的type_infoname

class CChTest
{
    public:
        static consteval const char*    test()
        {
            const char* ChReturn = typeid(CChTest).name();

            // ...
            // ...

            return ChReturn;
        }
};
jogvjijk

jogvjijk1#

如果你想在编译时得到类名,目前还没有标准的解决方案。
Boost类型索引库在过去十年中做得非常好。它的头文件,你只需要包括包含头文件的boost目录就可以在你的项目中使用它。

它建立在像__PRETTY_FUNCTION__ , __FUNCTION__ and __func__这样的宏之上。你可以直接使用这些宏,但是这取决于你的编译器,甚至是特定的编译器版本,类型名在字符串中的位置。所以最好让一个经过良好测试和维护的库来完成这项工作。

azpvetkf

azpvetkf2#

如果要在编译时计算类名,请声明一个包含预定义名称的static变量,如下所示:

class CChTest
{
public:
    static consteval const char* test()
    {
        const char* ChReturn = name;

        // ...
        // ...

        return ChReturn;
    }

private:
    static constexpr const char* name = "CChTest";
};

int main()
{
    CChTest test;
    std::cout << test.test();

    return 0;
}

这意味着您必须自己维护类名。
为了使它能够继承,让每个派生类override方法,这意味着你需要使它成为virtual consteval

相关问题