gpt4 book ai didi

c++ - 如何专门化从特定类型派生的类型的模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:13 25 4
gpt4 key购买 nike

我有类 World 管理对象的创建...创建后它调用 afterCreation 方法,我创建的对象是从实体派生的用户定义类型(例如.MyEntity), 我想调用addEntity。我的对象是别的东西,我什么也不想做。addEntity 必须使用适当的 T 调用,因为它会为每个派生类等生成唯一的 ID。

这是我的解决方案:

template <int v>
struct ToType
{
enum { value = v };
};

template <typename T>
void World::afterCreation(T * t)
{
afterCreation(t, ToType<std::is_base_of<Entity, T>::value>());
}

template <typename T>
void World::afterCreation(T * t, ToType<true>)
{
addEntity(t); //here I cant pass Entity *, I need the real type, eg. MyEntity
}

template <typename T>
void World::afterCreation(T * t, ToType<false>)
{

}

我的问题是 - 有没有更好的方法?

如何在没有 ToType 或类似代码的情况下模拟以下代码?

template <typename T>
void afterCreation(){/*generic impl*/}

template <typename T where T is derived from Entity>
void afterCreation(){/*some specific stuff*/}
  • 标题中的“specialize”只是说明我的意图,不需要用模板特化来解决问题

最佳答案

它不会使它变得更好,但您可以使用 SFINAE 删除一级间接:

template <typename T>
typename std::enable_if< std::is_base_of<Entity, T>::value >::type
World::afterCreation(T * t)
{
// Derived from Entity
}
template <typename T>
typename std::enable_if< !std::is_base_of<Entity, T>::value >::type
World::afterCreation(T * t)
{
// generic
}

这是如何运作的?当编译器找到对 afterCreation 的调用时,它会尝试确定哪个重载是最佳,并为此匹配类型并尝试执行替换。在这两种情况下,匹配的类型(来自参数)并将替换应用于整个表达式。 enable_if 模板包含内部类型 type 如果作为第一个参数传递的值是 true 否则它不包含这种类型。在类型替换期间,其中一个重载将产生无效的函数签名(条件为假的函数签名)并将从候选集中删除。

关于c++ - 如何专门化从特定类型派生的类型的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9942047/

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