gpt4 book ai didi

c++ - 我需要一些 C++ 专家关于扩展 std::string 的意见

转载 作者:可可西里 更新时间:2023-11-01 18:01:15 28 4
gpt4 key购买 nike

我一直希望 STL 的字符串具有更多功能。由于子类化 STL 类型是不行的,大多数情况下,我看到这些类的推荐扩展方法只是编写将类型作为第一个参数的函数(而不是成员函数)。

我从未对这个解决方案感到兴奋。一方面,所有这些方法在代码中的位置并不一定很明显,另一方面,我只是不喜欢这种语法。我想用 .当我调用方法时!

不久前我想到了以下内容:

class StringBox
{
public:
StringBox( std::string& storage ) :
_storage( storage )
{
}

// Methods I wish std::string had...
void Format();
void Split();
double ToDouble();
void Join(); // etc...

private:
StringBox();

std::string& _storage;
};

请注意,StringBox 需要对 std::string 的引用才能构造...这对其使用设置了一些有趣的限制(我希望这意味着它不会导致字符串类增殖问题)...在我自己的代码,我几乎总是只是在方法的堆栈上声明它,只是为了修改 std::string。

一个使用示例可能如下所示:

string OperateOnString( float num, string a, string b )
{
string nameS;
StringBox name( nameS );

name.Format( "%f-%s-%s", num, a.c_str(), b.c_str() );

return nameS;
}

我的问题是:StackOverflow 社区的 C++ 大师如何看待这种 STL 扩展方法?

最佳答案

I've never been thrilled with this solution. For one, it's not necessarily obvious where all such methods are in the code, for another, I just don't like the syntax. I want to use . when I call methods!

我想在调用方法时使用 $!---&!处理它。如果您要编写 C++ 代码,请遵守 C++ 约定。一个非常重要的 C++ 约定是尽可能优先使用非成员函数。

C++ 专家推荐这个是有原因的:

它提高了封装性、可扩展性和重用性。 (std::sort 可以与所有迭代器对一起使用因为它不是任何单个迭代器或容器类的成员。而且无论您如何扩展 std::string,你不能破坏它,只要你坚持使用非成员函数。即使你无权访问或不允许修改,一个类的源代码,你仍然可以通过定义非成员函数来扩展它)

就我个人而言,我看不出您的代码有什么意义。这不是更简单、更易读且更短吗?

string OperateOnString( float num, string a, string b )
{
string nameS;
Format(nameS, "%f-%s-%s", num, a.c_str(), b.c_str() );
return nameS;
}

// or even better, if `Format` is made to return the string it creates, instead of taking it as a parameter
string OperateOnString( float num, string a, string b )
{
return Format("%f-%s-%s", num, a.c_str(), b.c_str() );
}

俗话说,身在罗马,入乡随俗。 特别是当罗马人有充分的理由这样做时。尤其是当您自己的做法实际上没有任何优势时。它更容易出错,让阅读你的代码的人感到困惑,不符合惯用语,而且它只是做同样事情的代码行更多。

关于很难找到扩展 string 的非成员函数的问题,如果担心的话,请将它们放在命名空间中。这就是他们的目的。创建一个 namespace StringUtil 或其他东西,并将它们放在那里。

关于c++ - 我需要一些 C++ 专家关于扩展 std::string 的意见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2037826/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com