我正在编写 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
这样的方法,所以我不想为其他数据类型重复编写它们。这导致我编写一个通用版本父类(super class)。
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++ 经验较短,我对自己的设计没有信心。
您觉得这种模式怎么样?是好还是错?如果错了,那是哪里出了问题?
最佳答案
请阅读有关 CRTP 的更多信息。这实际上是很常见的设计模式。
关于C++ 泛型类设计,其方法返回子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20086900/