gpt4 book ai didi

c++ - 是否有可能打印迭代器指向的类的名称?

转载 作者:行者123 更新时间:2023-11-30 04:10:02 26 4
gpt4 key购买 nike

假设我有一个根据以下层次结构工作的程序: DIAGRAM

我有一个链表容器 Human *我正在用 std::list<Human *>::iterator human 进行迭代.以下迭代器可以指向 Men , WomenFlying Men .有没有可能,也许像typeid(*human).name()那将返回指向对象所属的类的名称?当我使用 typeid.name()我得到 class Human * .

最佳答案

在运行时根据类型检查选择执行路径是不好的,因为它把知识放在了不应该的地方,并且使得添加新类型变得更加困难,因为所有检查都必须用新的类型进行扩展类型 ID。

相反,定义一个接口(interface),允许所有需要它的类型创建自己的版本。这是一个可编译的示例,您可以复制并试用。请注意,添加应序列化的新类型不会更改现有类中的任何代码,也不需要新的测试。而且,作为奖励,所有内容都在编译时进行了类型检查,因此不可能添加错误类型对象的调用。

#include <iostream>
#include <list>

#include <boost/foreach.hpp>

class Output {
public:
// Whatever operations needed
int Write(int value) {
std::cout << value << std::endl;

return 0;
}
};

class Human {
public:
virtual ~Human() {}

virtual int Serialize(Output& output) = 0;
};

class Men : public Human {
public:
int Serialize(Output& output) {
return output.Write(17);
}
};

class Women : public Human {
public:
int Serialize(Output& output) {
return output.Write(42);
}
};

int main(int argc, char* argv[]) {
Output output;

Men men1;
Men men2;
Women women1;
Women women2;

std::list<Human*> toSerialize;

toSerialize.push_back(&men1);
toSerialize.push_back(&women1);
toSerialize.push_back(&men2);
toSerialize.push_back(&women1);

BOOST_FOREACH(Human* human, toSerialize) {
human->Serialize(output);
}

return 0;
}

关于c++ - 是否有可能打印迭代器指向的类的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20843864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com