gpt4 book ai didi

c++ - 如何最好地定义/构造/初始化 std::string 包装类

转载 作者:行者123 更新时间:2023-12-01 14:37:06 24 4
gpt4 key购买 nike

我正在使用 std::string 的包装类,但是初始化/构造它的最简单/最干净/最完整的方法是什么。我至少需要3种方法

  • 来自字符串文字
  • 来自 std::string 右值,避免复制!?
  • 来自 string_view 和 string(是的,复制)

天真的程序员只想将任何构造自动委托(delegate)给 std::string,但这不是一个功能。

struct SimpleString
{
SimpleString() = default;

template<typename T>
SimpleString( T t ) : Text( t ) { } // <==== experimental

// Alternative: are these OK
SimpleString( const char* text ) : Text( text ) { }
SimpleString( std::string&& text ) : Text( text ) { }
SimpleString( const std::string_view text ) : Text( text ) { }

std::string Text;
};

先发制人的说明:是的,我想要它,我需要它。用例:调用通用函数,其中 SimpleString 的处理方式与 std::string 不同。

关于从 std::string 继承的注意事项:可能是一个坏主意,因为隐式转换将在第一时间发生。

最佳答案

如果您的主要目标是字符串转换构造函数,那么您不需要经历任何巨大的麻烦。最简单、最好的方法是在 API 上按值接受 std::string 并将其 std::move 放置到位。

class SimpleString
{
public:
SimpleString() = default;
SimpleString(std::string text) : Text(std::move(text)) { }
// ... other constructors / assignment ...

private:
std::string Text;
};

这样做,我们可以利用 std::string 已经可以通过以下方式构造的事实:

  • C 字符串/文字,
  • std::string_view,
  • 其他 std::string 对象(左值或右值),以及
  • 任何可能已可转换为 std::string 的用户定义类型

这样做还让用户可以选择现在决定是否要通过移动当前的 std::string 对象或允许 来构造 SimpleString >SimpleString 显式复制它。这为调用者提供了更大的灵活性。

这效果很好,因为无论如何你已经拥有这个 std::string ,所以按值接受它并 std::move object 是“定位”该值的简单方法。移动 std::string 相当便宜,相当于对指针、大小和分配器进行一些赋值——因此这产生的性能开销可以忽略不计,同时也是一种简单且可维护的方法。/p>


现代 C++ 和移动语义使得接受这些类型变得如此容易。您绝对可以去重载构建它的所有 N 种方式(const char*std::string_viewT 可转换为字符串等);但按原样接受类型并移动它会简单得多。这是最灵活的方法,同时又保持简单和可维护。


Here are some benchmarks比较使用模板与使用 std::string + std::move。一般来说,保持简单会更有利。您的同事和 future 的维护者会感谢您(即使一年后 future 的维护者是您)。

关于c++ - 如何最好地定义/构造/初始化 std::string 包装类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63455759/

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