gpt4 book ai didi

c++ - 处理对象对时避免 RTTI

转载 作者:行者123 更新时间:2023-11-30 01:57:58 26 4
gpt4 key购买 nike

我看到了一些关于避免 RTTI 的问题,但我的问题似乎更具体一些。这是一个示例案例:

struct Base {};

struct A : Base {};
struct B : Base {};
struct C : Base {};

std::vector<Base*> vec;

我想对 vector 中所有可能的(无序的)对象对做一些事情(如果 vector 有 3 个元素,分别是 0 和 1、0 和 2、1 和 2)。我想要的伪代码是这样的:

if e1 is A and e2 is A:
behavior1(e1, e2)
elif e1 is A and e2 is B:
behavior2(e1, e2)
elif ...

很多人说 RTTI 是糟糕的设计,但这里可以避免吗?还有比执行所有这些 if/elif 更有效的方法吗?

最佳答案

无论您选择使用还是避免使用 RTTI,实际上更多的是关于常识。虽然努力避免它可能被认为是好的设计,但偶尔您只想完成一些事情并继续前进。

如果您只有几个类类型需要处理,您可以去掉 if/else if 并拥有一个简单的函数指针表。在每种类型中使用一个虚函数来增加用于查找要调用的正确函数的索引的权重:

struct Base
{
virtual int GetWeight() const = 0;
};

struct A : Base
{
virtual int GetWeight() const { return 1; }
};

struct B : Base
{
virtual int GetWeight() const { return 2; }
};

struct C : Base
{
virtual int GetWeight() const { return 4; }
};


static void (*MyBehaviours)( Base*, Base* )[] = { &behaviour1, &behaviour2, ... };

MyBehaviours[ e1->GetWeight() + e2->GetWeight() ]( e1, e2 );

关于c++ - 处理对象对时避免 RTTI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18013217/

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