在 C++ 中向 std::string 添加函数
Adding functions to std::string in c++
我只是遗漏了c++标准库string中的一些函数class,所以我只想自己添加这些。我写了这个:
#include <string>
class String : public std::string
{
public:
// some new fancy functions
};
后来通过阅读一些论坛注意到,从 std::string 和标准库中的任何其他容器继承是一个坏主意。
我只想要普通的字符串,但是有自己写的附加函数,我该如何正确实现呢?或者没有办法正确地做,我必须纠正我自己的字符串 class?
首先 - std::string
有点乱,原样有太多方法。将功能集中到不需要 class 的 class 中是糟糕的设计,并且可以使用更简单、更基本的 class 方法轻松实现 - 作为独立功能。
此外 - std::string
同时难以操作(它不是字符串缓冲区或 std::stringstream
),而且并非无法操作,即不是不可变的。
但是回到我之前的观点:"right way" - 如果有的话 - 可以用独立的函数来做你想做的事。例如,假设您想随机排列 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
class - 我们有一个基于字符类型的模板(和分配器等),所以如果你想是通用的,你必须接受这个 class:
template<
class CharT,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_string;
PS - 如果我们有统一的调用语法,比如 Bjarne proposed - 我们真的应该恕我直言 - 你的独立函数可以简单地被调用,就好像它们是成员一样:
auto jumbled = my_string.jumble();
我只是遗漏了c++标准库string中的一些函数class,所以我只想自己添加这些。我写了这个:
#include <string>
class String : public std::string
{
public:
// some new fancy functions
};
后来通过阅读一些论坛注意到,从 std::string 和标准库中的任何其他容器继承是一个坏主意。
我只想要普通的字符串,但是有自己写的附加函数,我该如何正确实现呢?或者没有办法正确地做,我必须纠正我自己的字符串 class?
首先 - std::string
有点乱,原样有太多方法。将功能集中到不需要 class 的 class 中是糟糕的设计,并且可以使用更简单、更基本的 class 方法轻松实现 - 作为独立功能。
此外 - std::string
同时难以操作(它不是字符串缓冲区或 std::stringstream
),而且并非无法操作,即不是不可变的。
但是回到我之前的观点:"right way" - 如果有的话 - 可以用独立的函数来做你想做的事。例如,假设您想随机排列 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
class - 我们有一个基于字符类型的模板(和分配器等),所以如果你想是通用的,你必须接受这个 class:
template<
class CharT,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_string;
PS - 如果我们有统一的调用语法,比如 Bjarne proposed - 我们真的应该恕我直言 - 你的独立函数可以简单地被调用,就好像它们是成员一样:
auto jumbled = my_string.jumble();