通过添加构造函数和一些成员函数来扩展 std::(w)字符串
Extending std::(w)string, by adding a constructor and some member functions
当然,std::string
界面已经很臃肿了。但它缺少一些(对我来说)关键元素。例如,不能从纯const char*
构造std::wstring
(这是从字符串文本创建所需的)。我还想添加一个operator/
和一个split
函数。无论如何,这都不是问题的重点。这阻止了我为项目编写核心类的胆量。
我知道我可以私下继承std::(w)string
,并"导入"所有成员using
。这错过了关键的非成员模板函数,这些函数很多。
我怎样才能更好地解决这个问题?我知道公共继承"解决"了这个问题,但它引入了在没有虚拟析构函数的情况下delete
类的基类指针的问题。请注意,我不打算添加数据成员,所以这真的是一个问题,还是这个极端情况仍然可以使用公共继承?
请不要说"不要这样做",除非你能提供一种方法:1)做我想做的事,2)不需要我自己写,3)不会膨胀我的调用方界面。
不要从std::basic_string<...>
派生,而是创建执行适当操作的算法,例如:
template <typename cT>
std::basic_string<cT> construct(char const* str) {
// ...
}
同样适用于split()
、operator/()
等。原则上,std::basic_string<...>
的大多数成员首先不应该是成员......
相关文章:
- C++中的VLA,扩展名为std=C++11
- 可变参数模板参数扩展 类型为 std::function 的类成员
- 如何使用 std::forward 精确地评估参数包的扩展?
- 有什么理由不扩展 std::set 以添加下标运算符吗?
- 有没有办法扩展和调用 std::functions 的元组?
- 如何为缺少预定义运算符而不扩展命名空间"std"的标准类型定义运算符>> (istream &, ...)?
- 使用std::index_sequence对std::数组初始化进行包扩展
- 从函数为 std::vector 创建自定义扩展
- Visual Studio 2017中的哪些扩展在传入lambda时消除了"bool"与"std::function"的歧义?
- 如何将 Python 对象转换为 Cython 扩展类型的 std::vector 并返回?
- 用一个额外的元素扩展 std::array 的每个 std::元组
- 传递 std::array 参数,其大小限制为可扩展的大小集
- 如何正确扩展 std::thread 来包装生成的线程
- 扩展命名空间 std 以在使用 C++11 时实现make_unique
- G++ - 警告:扩展初始值设定项列表仅适用于 -std=C++11 或 -std=GNU++11
- 动态创建和扩展STD ::元组为参数包
- 扩展 std::vector 是个好主意吗?
- 扩展初始化器列表仅可用-STD = C 11或-STD = GNU 11中的C
- variadic模板扩展,继承和std :: unique_ptr
- "std::isdigit"正在崩溃几个扩展的 ASCII 字符