[英]Specializing the template of std::vector
我正在尝试获取std :: vector来保存定长字符串,而不通过包装类引入间接寻址。 我的想法是对自定义类型的std::vector
进行特殊化,其行为类似于外部的std::vector
,但使用其自己的存储布局。 有点像std::vector<bool>
。
我看着“ 扩展命名空间std ”,但没有找到不应该这样做的原因。 我可以做以下事情,如果不能,我将面对哪种类型的地狱?
#include <iostream>
#include <vector>
class FixedString {};
namespace std {
template <>
class vector<FixedString> {
public:
void push_back( FixedString&& value ) {
std::cout << "Welcome to my vector. Let's play a game!" << std::endl;
}
};
// here be more vector methods.
}
int main () {
std::vector<int> a;
a.push_back(int{});
std::vector<FixedString> b;
b.push_back(FixedString{});
}
编辑:我知道可能会有更好的方法,评论中的讨论帮助我了解了问题所在。 尽管如此,我还是想了解这是否合法(即使不受欢迎)的C ++代码。 人们在下面暗示了[namespace.std],但我想了解完全专门的向量类将违反哪些规则。
[namespace.std]中的规则是:
仅当声明依赖于用户定义的类型并且该特殊化满足原始模板的标准库要求且未被明确禁止时,程序才可以将任何标准库模板的模板特殊化添加到命名空间std。
因此,有两个标准:“取决于用户定义的类型”(更好的术语,希望会采用,是程序定义的类型)和“满足原始模板的标准库要求”。 您的示例符合第一个条件,但违反了第二个条件,因此它是未定义的行为。
但是,如果您继续填写其余要求(请参阅[container.requirements]和[sequence.reqmts]和[vector] )以符合第二个条件,那么就可以了。 但是值得怀疑。 只需编写您自己的容器,最少意外的原则等等。 当人们看到std::vector<T>
他们会认为它实际上是std::vector
。 std::vector<bool>
够糟糕的,不要添加另一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.