无法转发声明 std::string 和 std::wstring 的问题经常被讨论。据我了解,原因是这些类型是模板类 basic_string 实例化的类型定义:
namespace std {
typedef basic_string<char> string;
typedef basic_string<wchar_t> wstring;
}
并且该语言不允许向前声明 typedef。
对于 C++ 标准来说,使用继承而不是 typedef 不是更好吗:
namespace std {
class string : public basic_string<char> {};
class wstring : public basic_string<wchar_t> {};
}
这样我们就可以向前声明 std::string 和 std::wstring 吗?
对于 C++ 标准来说,使用继承而不是 typedef [...]
No.
std::basic_string 不意味着以任何形式继承。此限制允许实现 std::basic_string,创建和销毁的成本要低得多(更快),因为它没有虚函数表。
如果您需要定义 std::[w]string,只需#include
it.
Edit(回复评论)
C++(和标准库)的指导原则之一是“不要为不使用的东西付费”。这意味着代码的编写方式不应让您因不需要的功能而产生运行时成本。
如果每个实例都有一个虚拟表,那么创建 std::string 实例的成本会高得多(这会导致在性能关键型代码中禁止使用 std::string)。
相反,std::string 旨在作为 C 语言的快速、类型安全、RAII 实现char*
机制。同样,您不应尝试继承 std::vector、list、map、shared_ptr、unique_ptr 等。
如果您确实需要一个字符串基类,请考虑编写一个your_namespace::[w]string_base
你自己(一个简单的实现是封装一个std::[w]string
内部)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)