某种类型的泛型类变量

时间:2013-02-27 21:46:02

标签: c++ class generics types where

在C#中我可以定义:

public interface BaseObject
{
    int GetValue();
}

public class Test<T> where T : BaseClass
{
    T BaseObject;
}

这意味着我知道我总是可以调用BaseObject.GetValue()/ BaseObject-&gt; GetValue();因为我知道baseobject有这种方法。

在C ++中有类似的方法吗?这样我就可以定义一个多个类可以继承的接口和一个可以利用它的类。

2 个答案:

答案 0 :(得分:0)

模板,它比C#泛型更强大(并不是说它们必须更好,只是不同)。

template<class T>
class foo
{
public:
    int whatever() 
    { 
        return obj.GetValue();
    }
private:
    T obj;
};

为您使用的每个模板参数创建一个单独的类。如果您提供的模板类型会导致错误,您将在编译时知道。

答案 1 :(得分:0)

您正在询问 C ++概念,这是一种指定模板参数要求的方法。它们是在C ++ 11工作期间提出的,但事实证明它们很复杂,没有及时完成。但他们只是被推迟了,而不是被遗忘。

与此同时,duck typing仍然非常强大,当你传递一个没有所需接口的模板参数时它会被捕获。它只是不会整齐地报告问题。

作为一种解决方法,检查您显示的约束的一种简单方法利用了指针转换仅在向上转换时隐式的事实:

public class Test<T> where T : BaseClass
{
    static T* enforcement_helper = 0;
    static BaseClass* enforce_inheritance_constraint = enforcement_helper;

};

根据编译器的新增方式,您可能需要将这些行放在特殊的成员函数中(析构函数很好,因为它几乎总是被处理)。

但是您应该只检查约束以改进错误消息(通过在明确注释的代码段中导致失败)。 C ++模板是鸭子类型,它们将与任何提供所需操作的模板参数一起使用。不需要正式的“界面”。