可能重复:
Template Constraints C++
我想知道我是否可以检查类型T是否在我的通用/模板化方法中继承了某个类。我可以使用'where'在C#中轻松完成。例如,在我的游戏引擎中,我有一个通用管理器的概念,它是一个XNA组件。它有一个可绘制对象列表(可能是实体,粒子等)。所以我的班级定义是这样的:
public class LayerableDrawableGenericManager<T> : Microsoft.Xna.Framework.DrawableGameComponent where T : Drawable
所以我们只能有一个可以绘制的对象的泛型管理器(一个继承drawable的对象)。我们需要确定这一点,因为在我的通用管理器中,我在所有这些T类型对象上调用Draw()
。如果不确保T类型对象将继承Drawable类(包含Draw()
方法),我将无法绘制对象。
无论如何,想知道如何在C ++中完成这项工作。我已经搜索过“Where C ++”和“Where keyword C ++”之类的内容,我的所有结果都是“我在哪里可以学习C ++”......
答案 0 :(得分:2)
这通常在C ++模板中完成,只需假设该类型提供了您需要的功能。例如,请考虑以下函数模板:
template <typename T>
int get_value(T const& x)
{
return x.get();
}
struct S { int get() const { return 42; } };
如果您致电get_value(S())
,编译器将使用get_value
实例化T = S
,并且会调用S::get
。
如果调用get_value(42)
,编译器将尝试使用get_value
实例化T = int
,但实例化将失败并且您将收到编译错误,因为int
没有有任何成员函数(或多或少有一个名为get
)。
答案 1 :(得分:0)
不确定。显而易见的方法是dynamic_cast
template<class T>
bool is_Iinterface(T obj) {
Iinterface ptr = dynamic_cast<Iinterface>(obj);
if (ptr == nullptr)
return false;
else
return true;
}
或简明扼要地说:
template<class T>
bool is_Iinterface(T obj) {
return dynamic_cast<Iinterface>(obj)!=nullptr;
}
但是,更常见和有用的方法是使用运算符重载。
template<class T>
void do_task(T obj) {
//do task on object that doesn't have Iinterface
}
void do_task(Iinterface& obj) {
//do task on object that does have Iinterface
}