【发布时间】:2020-08-17 17:25:15
【问题描述】:
我在 std::string 周围使用了一个包装类,但是初始化/构造它的最简单/最干净/最完整的方法是什么。我至少需要 3 种方法
- 来自字符串文字
- 从 std::string 右值,避免复制!?
- 来自 string_view 和 string(是的,复制)
天真的程序员只想将任何构造自动委托给 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 继承的注意事项:可能是个坏主意,因为一有机会就会发生隐式转换。
【问题讨论】:
-
为什么需要
std::string包装器?用例是什么?它应该提供哪些std::string没有的功能?如果你只需要给它添加一点功能,你最好只继承它。 -
@J.Schultke 你读过抢注吗?
-
我会立即使用该派生类变体,但认为它不受欢迎(无论出于何种原因)。应该没问题,如果我的课程只是一个包装器,什么都不添加!?如果我想添加一个标志怎么办?啊,皱眉的原因是隐式转换到 std::string,我需要避免。
-
Josuttis 有一个非常有趣的演讲,谈到了一个类似的案例和
move的问题在这里:youtu.be/PNRju6_yn3o?t=233