Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检索c++;类名称以编程方式 我想知道C++中是否有可能在字符串形式中检索类的名称,而不必将其硬编码为变量或吸气剂。我知道这些信息在运行时没有实际使用过,因此不可用,但是有没有可以创建此功能的宏 编辑:注意我实际上是想检索派生类的名称,我使用Visual C++ 2008 Express版。 < p>可以使用 Type ID < /> >: #include <typeinfo> std::cout << typeid(obj).name() << "\n";_C++_Class_Macros - Fatal编程技术网

检索c++;类名称以编程方式 我想知道C++中是否有可能在字符串形式中检索类的名称,而不必将其硬编码为变量或吸气剂。我知道这些信息在运行时没有实际使用过,因此不可用,但是有没有可以创建此功能的宏 编辑:注意我实际上是想检索派生类的名称,我使用Visual C++ 2008 Express版。 < p>可以使用 Type ID < /> >: #include <typeinfo> std::cout << typeid(obj).name() << "\n";

检索c++;类名称以编程方式 我想知道C++中是否有可能在字符串形式中检索类的名称,而不必将其硬编码为变量或吸气剂。我知道这些信息在运行时没有实际使用过,因此不可用,但是有没有可以创建此功能的宏 编辑:注意我实际上是想检索派生类的名称,我使用Visual C++ 2008 Express版。 < p>可以使用 Type ID < /> >: #include <typeinfo> std::cout << typeid(obj).name() << "\n";,c++,class,macros,C++,Class,Macros,这仍然不一定是一个可读的名称-例如,std::string是实际类型的类型名,而其在当前libstdc++中的完整类型名是std::u cxx11::basic_string;相比之下,在当前的libc++中,它是std::\uu 1::basic\u string。不幸的是,“美化”类型别名并非微不足道。如果您只想检查它是否是某个类,那么 typeid(obj) == typeid(CSubClass) 无论实现如何,都将始终有效 否则,一个方便的方法是声明: virtual const c

这仍然不一定是一个可读的名称-例如,
std::string
是实际类型的类型名,而其在当前libstdc++中的完整类型名是
std::u cxx11::basic_string
;相比之下,在当前的libc++中,它是
std::\uu 1::basic\u string
。不幸的是,“美化”类型别名并非微不足道。

如果您只想检查它是否是某个类,那么

typeid(obj) == typeid(CSubClass)
无论实现如何,都将始终有效

否则,一个方便的方法是声明:

virtual const char* classname() { return "CMyClass";}
和每个子类实现。

类型ID(obj).name()总是给出声明时的变量类型,而不是对象的实际类型(类)。如果变量obj被分配给obj被声明为的类的子类的实例,不幸的是,typeid没有揭示这一点。

使用Visual Studio 2019(v142)在Windows 10上测试

在Ubuntu 18.04中

g++ -o test src/main.cpp
./test
Class name of Person() is "6Person"
Class name of Data() is "4Data"
Class name of Type() is "4Type"
Class name of double is "d"
Class name of std::string is "NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE"
Class name of int is "i"
Class name of float is "f"
Class name of char is "c"
使用C++17和a,现在可以获得类的名称,如

#include <iostream>
#include "nameof.hpp"

namespace test {
    class Object {};
}

int main() {
    constexpr auto obj_name = nameof::nameof_type<test::Object>();
    std::cout << obj_name << std::endl;
    // this prints "test::Object"
}
#包括
#包括“nameof.hpp”
名称空间测试{
类对象{};
}
int main(){
constexpr auto obj_name=nameof::nameof_type();

STD:因为这是编译器依赖的,你使用什么编译器?我用Visual C++ 2008 Express,我想这将是有益的,注意我实际上是试图检索一个派生类的名称,也许这个有趣的,我不知道这个。它似乎工作得很好。它给了我比我在RESP想要更多的文本。onse,但它似乎工作得很好。谢谢!如果类中没有虚拟方法,这会起作用吗?我认为RTTI在这种情况下不起作用。我想只要你有一个虚拟析构函数,你就可以了。@LeopardSkinPillBoxHat:是的,它会起作用(请参阅§5.2.8/3和§4)。这是一个常见的误解,认为
typeid
只适用于多态类型,可能是由于与RTTI特性的相似性。事实上,在静态类型上使用
typeid
不需要,也不使用RTTI。运算符在编译时计算,结果在中编译(严格来说,这是一个实现细节,但它是唯一正常的实现)给了我具体类的名称。我遇到了同样的问题,但是@stephelton的评论让我意识到我是在一个指针上调用它,而不是在实际的对象或引用上,它返回了指针的类型!只需添加
*
修复了所有问题。在
基类*ptr=新的子类;
我发现
typeid(ptr).name()
产生
类基类*
,而
typeid(*ptr).name()
给出
类子类
@jonathanlibeck在删除前缀“class”后能够找到正确的类名。简单,编译。错误,不幸。
typeid()
返回一个
typeinfo*
,一个指针。如果两个
typeinfo*
指针相等,它们引用相同的类型,但是如果它们不相等,它们仍然可以引用相同的类型。这就是为什么有一个语义正确的
std::type_索引
类。
std::type_索引(typeid(obj))==std::type_索引(typeid(CSubClass))
当且仅当两种类型相等时才为真。
Class name of Person() is "Person"
Class name of Data() is "Data"
Class name of Type() is "Type"
Class name of double is "double"
Class name of std::string is "std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >"
Class name of int is "int"
Class name of float is "float"
Class name of char is "char"
g++ -o test src/main.cpp
./test
Class name of Person() is "6Person"
Class name of Data() is "4Data"
Class name of Type() is "4Type"
Class name of double is "d"
Class name of std::string is "NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE"
Class name of int is "i"
Class name of float is "f"
Class name of char is "c"
#include <iostream>
#include "nameof.hpp"

namespace test {
    class Object {};
}

int main() {
    constexpr auto obj_name = nameof::nameof_type<test::Object>();
    std::cout << obj_name << std::endl;
    // this prints "test::Object"
}