C++ 泛型类设计,其方法返回子类

标签 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这样的方法,所以我不想为其他数据类型重复编写它们。这导致我编写一个通用版本父类(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/

相关文章:

c++ - 在 C++ 中创建具有多次重复的相同元素的数组

c++ - 如何获取整数模板参数的值?

c++ - 使用更多标准类型显式实例化给定模板函数的函数?

c++ - Linux,静态库引用可执行文件中的其他静态库

c++ - 使用 dirent 提取文件名

C++ - 更改另一个文件的 ASM 指令

javascript - 使用 RequireJS(text.js 插件)和 Underscore 进行模板化

c++ - QSqlQuery 插入完整结构而不是单个字段?

c++ - 标准库有比较器反转机制吗?

python - 如何在 Jinja2 模板中连接 int 和 str 类型?