Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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++_C++11_Design Patterns_Rtti - Fatal编程技术网

C++ 在运行时确定对象类型的最佳方法

C++ 在运行时确定对象类型的最佳方法,c++,c++11,design-patterns,rtti,C++,C++11,Design Patterns,Rtti,所以我要做的是实现消息模式。据我所知,用户将根据我输入的消息类型进行操作,而不是执行操作的消息类型。因此,我的做法如下: 我想获取对象的数据类型,以便执行switch语句,但我不确定从何处开始 我浏览过谷歌并做了一些研究,但没有一个是成功的。这就是我尝试过的: Decltype:甚至不接近我想要的 我不太清楚如何使用 动态演员阵容:不接近我想要的 基本上,我想在最后得到的是这样的东西: switch (typeof(a)) { class_a : //do something

所以我要做的是实现消息模式。据我所知,用户将根据我输入的消息类型进行操作,而不是执行操作的消息类型。因此,我的做法如下:

我想获取对象的数据类型,以便执行switch语句,但我不确定从何处开始

我浏览过谷歌并做了一些研究,但没有一个是成功的。这就是我尝试过的:

  • Decltype:甚至不接近我想要的
  • 我不太清楚如何使用
  • 动态演员阵容:不接近我想要的
基本上,我想在最后得到的是这样的东西:

switch (typeof(a)) {
    class_a : //do something
    class_b : //do something
}

if语句对我也同样适用。有人能帮我吗?我更喜欢使用标准库。

< P>标准C++中没有<代码>类型< /COD>(虽然有GCC扩展名)。你在找接线员。这将返回对包含对象的运行时类型信息(RTTI)的
静态常量的引用。您可以将结果与感兴趣的各种类的
typeid
s进行比较

作为一个简单的例子():

#包括
#包括
甲级{
公众:
虚拟~A(){}
};
B类:公共A{};
C类:公共A{};
int main(){
常数A&A=C{};
const auto&id=typeid(a);
如果(id==typeid(B)){
标准::cout
动态演员阵容:不接近我想要的

你拿错了。动态演员当然可以做你想做的

if (dynamic_cast<c1*>(a)) { ... }
else if (dynamic_cast<c2*>(a)) { ... }
if(dynamic_cast(a)){…}
else if(动态_cast(a)){…}
*a
的静态类型必须是多态的。这同样适用于引用。如果按值传递,则它不起作用,也不能起作用


这是一种危险且容易出错的实现方法。如果您想实现M类收件人类型的N种消息类型,所有m×n操作可能不同,请考虑使用访问者模式,特别是它的非循环实现。<代码> > Booo::变体< /COD> @ USE1034。在不使用外部库的情况下执行此操作?这可能是一个问题。你想实现什么?@bolov我正在尝试实现消息模式。据我所知,它将基于对象来定义我输入的消息并据此采取行动。你可以在c++11中使用

union
来管理不平凡的对象,但实际上你编写的几乎是e与
boost::variant
boost::any
相同的代码你好。我完全了解虚拟方法的使用。正如我在文章开头提到的,我正在尝试实现消息模式,它要求用户知道我传入的对象的类型。因此,谢谢:)删除了基本建议,添加了高级建议。我有2个问题问题:1.如果我坚持这一点,基本上我必须存储一个我想要比较的类型的对象,对吗?它不能直接与类比较(蓝图)本身?2.将显式值作为消息传递是什么意思?如果需要,您可以直接传递对
std::type_info
结构的引用;您不必实例化对象(例如,请参见我正在执行的
typeid(B)
)。如果我理解正确,您只是尝试在组件之间发送消息,然后根据消息执行不同的操作?通常您只需发送一个实例(显式值)即可一个<代码> EnUM <代码>,它和C++中一样快。在你的代码< Type ID >代码>之后,你对对象做了什么?所以在我的当前架构中,我有3种不同类型的消息和1个用户。每个消息都有一个基类作为基础。对于消息的类型,我会让用户采取不同的行动。但我刚刚想到了一种方法,在每个子类中创建一个新变量,并在其中放入一个枚举。然后用户可以轻松地检查枚举以获得消息的类型:D
if (dynamic_cast<c1*>(a)) { ... }
else if (dynamic_cast<c2*>(a)) { ... }