C#中的C#“T:type”

时间:2012-03-22 00:15:21

标签: c++ generics types where

  

可能重复:
  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 ++”......

2 个答案:

答案 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
}