-2

在 C# 中,我可以这样定义:

public interface BaseObject
{
    int GetValue();
}

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

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

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

4

2 回答 2

0

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

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

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

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

};

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

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

于 2013-02-28T00:13:54.793 回答
0

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

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

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

于 2013-02-27T21:48:15.953 回答