如何在C ++中制作这样的东西:
C#代码:
std::enable_if_t<is_vector_expression_v<F1> && is_vector_expression_v<F2>
答案 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_component
是B
的子类。为了在我自己的项目中解决这个问题,我的所有游戏组件和对象都嵌入到Python中,我将其列入我的类型和层次结构检查。