在C ++中返回一个T类型

时间:2016-04-11 16:37:29

标签: c++ entity

如何在C ++中制作这样的东西:

C#代码:

std::enable_if_t<is_vector_expression_v<F1> && is_vector_expression_v<F2>

2 个答案:

答案 0 :(得分:1)

返回泛型类型'T'很容易,但是没有(很好)等价于C#约束(但请参阅callyalater的注释):

   public:
   template<typename T> // where T : Component - no equivalent
   T GetComponent()
   {
        for (auto c : Components)
        {
            if (dynamic_cast<T>(c) != nullptr)
            {
                return static_cast<T>(c);
            }
        }
        for (auto c : componentsToAdd)
        {
            if (dynamic_cast<T>(c) != nullptr)
            {
                return static_cast<T>(c);
            }
        }
        return nullptr;
   }

答案 1 :(得分:1)

你要求的实际上非常复杂。 C ++没有本机类型反射,因此您无法在运行时(轻松)确定类型是否是另一个类型的子类。这种实时类型检查必须手动完成。

这不是一个完整的解决方案,但它应该让你成为那里的一部分:

这是我自己的引擎中的类似代码。这里重要的一点是函数声明上方的folder/

template

然后你这样称呼它:

map<type_index, shared_ptr<GameComponent>> type_components;

template<typename T = enable_if<is_base_of<GameComponent, T>::value>::type>
shared_ptr<T> get_component() const
{
    static const std::type_index TYPE_INDEX = typeid(T);

    auto component = type_components.find(TYPE_INDEX);

    if (component == type_components.end())
    {
        return nullptr;
    }

    return static_pointer_cast<T, GameComponent>(*component);
}

template<typename T = enable_if<is_base_of<GameComponent, T>::value>::type>
shared_ptr<T> add_component()
{
    static const type_index TYPE_INDEX = typeid(T);

    auto component = make_shared<T>();

    type_components.insert(make_pair(TYPE_INDEX, component));

    return component;
}

如果传入的类型不是get_component<DerivedGameComponent>(); 的基础,编译器将抛出错误。

与C#等价物相比,系统的局限性非常明显。首先也是最明显的,它对类型层次结构一无所知。例如:

GameComponent

struct A : GameComponent { }; struct B : A { }; add_component<B>(); get_component<A>(); 调用将返回null,因为它不知道get_componentB的子类。为了在我自己的项目中解决这个问题,我的所有游戏组件和对象都嵌入到Python中,我将其列入我的类型和层次结构检查。