0

我正在尝试为我的 gui 实现抽象一个通用接口,但我很难弄清楚如何干净地做到这一点。这是我想要实现的简化版本。

class IBorderable
{
    virtual unsigned int getBorderWidth(BorderIndex index) const = 0;
    virtual void setBorderWidth(BorderIndex index, unsigned int width) = 0;
};

class Square : public IBorderable
{
    // Implement while limiting BorderIndex to only 4
    // Calling with invalid BorderIndex is handled at compile time
};

class Cube : public IBorderable
{
    // Implement while limiting BorderIndex to only 6
};

理想情况下,我想通过多态性来做到这一点,而不需要任何条件检查来确保 BorderIndex 在范围内。是否有可能让它在编译时抛出错误?我本来希望使用强类型枚举,但它们无法派生。

4

2 回答 2

1

如果没有使通用接口的整个点无用的技巧,恐怕在编译时检查是不可能的。在运行时执行它当然很容易。

只有一个 IBorderable 引用/指针的编译器不知道它背后有什么样的派生对象,它也不需要——这就是接口和虚函数的全部意义所在。

于 2013-04-19T08:56:52.513 回答
0

您可以使 IBorderable 成为模板,并使用 std::enable_if 使对无效索引的调用在编译时失败。

但我建议您将 IBorderable 设为包含 n 个 Border 实例的容器,并在运行时访问无效索引时处理错误。我觉得模板化(编译时最大索引检查)解决方案增加的复杂性是不值得的。

于 2013-04-19T08:48:20.117 回答