C ++泛型类设计,带有返回子类的方法

时间:2013-11-20 03:42:42

标签: c++ templates

我正在编写Unicode代码点的通用列表。问题是我也想要一些允许专门版本的通用类设计。这是一个例子。

这是一个例子。

class
MyString
{
public:
    auto getItemAt(int index) const -> UnicodePoint const;
    auto subsetInRange(int index, int length) const -> MyString const;
    auto getUTF8Binary() const -> std::string const;
};

这里只有一个,但实际上,有很多方法,如subsetInRange,所以我不想重复为其他数据类型编写它们。这导致我编写了一个通用版本的超类。

template<typename T, typename FINAL_SELF_TYPE>
class
MyList
{
public:
    auto getItemAt(int index) const -> T const;
    auto subsetInRange(int index, int length) const -> FINAL_SELF_TYPE const;
    // getUTF8Binary() removed because it's inappropriate on this abstraction level.
};

class
MyString : public MyList<UnicodePoint, MyString>
{
public:
    auto getUTF8Binary() const -> std::string const;
};

最后,我不得不承认我必须将最终类类型作为模板参数传递给MyList类,以使其正常工作。它感觉有些不对劲。我不能说它究竟是什么,但我的大脑不断发出警告信号。我认为这是因为我在抽象的普通班上提供了一些专业化信息。这似乎是循环依赖 - 在任何情况下都不好。它完全反对类层次结构。

但是当我写一些通用类时,方法返回相同类型的结果,我总是看到这种模式。这让我烦恼。由于我的C ++经验很短,我对自己的设计没有信心。

这种模式对你有什么影响?好还是错?如果这是错的,那有什么不对?

1 个答案:

答案 0 :(得分:2)

请详细了解CRTP。这实际上是很常见的设计模式。