c++ - 在 C++ 中向 std::string 添加函数
问题描述
我只是错过了c++标准库字符串类中的一些函数,所以我只想自己添加这些。我写了这个:
#include <string>
class String : public std::string
{
public:
// some new fancy functions
};
后来通过阅读一些论坛注意到,从 std::string 和标准库中的任何其他容器继承是一个坏主意。
我只想要普通的字符串,但是有自己编写的附加功能,我怎样才能以正确的方式实现呢?或者有没有办法做对,我必须纠正我自己的字符串类?
解决方案
首先 -std::string
有点乱,并且有太多的方法。将功能集中到一个不需要在该类中的类中是糟糕的设计,并且可以使用更简单、更基本的类方法轻松实现 - 作为独立函数。
此外 -std::string
同时难以操作(它不是字符串缓冲区或std::stringstream
),并且并非不可能操作,即不是不可变的。
但回到我之前的观点:“正确的方式”——如果有的话——做你想做的事是使用独立的功能。例如,假设您想随机排列std::string
. 好吧,要么:
std::string& jumble(std::string& str)
或者
std::string jumble(std::string str)
或者,如果你想感觉很酷和微优化,
std::string jumble(const std::string& str)
std::string jumble(std::string&& str)
取决于您是否想将字符串更多地用作不可变实体或可变实体。
还要记住,我们实际上并没有一个std::string
类——我们有一个基于字符类型的模板(和一个分配器等),所以如果你想成为通用的,你必须接受这个类:
template<
class CharT,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_string;
PS - 如果我们有统一的调用语法,就像Bjarne 提议的那样——恕我直言,我们真的应该这样做——你的独立函数可以简单地被调用,就好像它们是成员一样:
auto jumbled = my_string.jumble();
推荐阅读
- android - Android Kotlin NavigationView 将角半径添加到项目图标
- vb.net - 无论如何我可以用电报机器人更改 textbox1.text 值吗?
- python - 错误:无法确定关系的真值
- java - 在创建从 T 类型展开的链表中创建二维数组的方法时遇到问题
- vhdl - 更改输入后,sha256 代码的输出保持不变
- android - 如何在jetpack compose中正确使用自定义AlertDialog?
- java - 无法同时反序列化对象和对象列表
- python - 如何使用python替换csv中的双引号和四引号?
- sql - 从 SQL 查询中的特定发布日期开始获取每个客户帐户的费用/调整?
- json - 类型不匹配。预计解码字典
但找到了一个数组