gpt4 book ai didi

c++ - 如何检查多态子类的模板参数类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:50 27 4
gpt4 key购买 nike

我有一个类层次结构,其中 I<T>O<T>是扩展 B 的模板类(普通类)。 I骨料 O通过指针,像这样:

class B { ... };
template <class T>
class O : public B
{
T getValue() { return value; }
private:
T value;
}
template <class T>
class I : public B
{
T getValue() { return ptr->getValue(); }
void setPtr(O<T>* po) { ptr = po; }
private:
O<T>* ptr;
}

上面的代码确实被简化了,只显示了它的骨架。 “正在连接” IO尽管通过用户配置参数自动完成。因此,单例表存储多态 B指向所有 I 的指针和 O对象并通过调用 I::setPtr 执行链接有必要的。但问题是,用户实际上可能会弄乱并混淆 I 的模板类型。和 O对象,例如用户可以要求连接 I<int>O<float> .例如:

O<int>* oi = new O<int>();
O<float>* of = new O<float>();
I<int> ii;
ii.setPtr(oi); /* This is OK. */
O<int>* oi_wrong = static_cast<O<int>*>((B*)of); /* This happens. */
ii.setPtr(oi_wrong); /* This is bad. */

为了防止这种行为,我在 I 中都包含了一个成员变量。和 O存储 typeid(T).name() ,从而允许检查模板参数是否实际上相同。

有没有更好的方法?

编辑: 是否有更好的方法在这里进行转换?在这种情况下存储和使用多态指针不是一个好主意吗?

最佳答案

如果您的用户故意滥用您的界面,您实际上无能为力 - 您应该(合理地)设计您的代码,而不要假设您的用户将使用 static_cast 并且reinterpret_cast 自由。

在您的情况下,我不会添加任何额外的代码/检查。假设您的用户以合理的方式行事。


如果你真的想要,你可以使用 assertdynamic_cast 来检查传递的指针是否真的是你在 DEBUG 构建中所期望的:

struct A { virtual ~A() { } };
struct B : A { };
struct C : A { };

void setPtr(A* po)
{
assert(dynamic_cast<C*>(po) != nullptr);
}

int main()
{
B b;
setPtr((C*)&b); // might trigger assertion
}

但我强烈建议不要这样做,因为这太过分了。

关于c++ - 如何检查多态子类的模板参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46885440/

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