我试图让std :: vector保存固定长度的字符串而不通过包装类引入间接。我的想法是对我的自定义类型std::vector
进行专门化,其行为类似于std::vector
,但使用自己的存储布局。有点像std::vector<bool>
。
我看了&#34; Extending the namespace std&#34;并没有找到我不应该的理由。我可以做以下事情,如果没有,我面对的是什么类型的地狱?
#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],但我想了解一个完全专业的矢量类会违反哪些规则。
答案 0 :(得分:2)
[namespace.std]中的规则是:
只有当声明取决于用户定义的类型并且特化符合原始模板的标准库要求且未明确禁止时,程序才可以将任何标准库模板的模板特化添加到命名空间std。
因此,有两个标准:&#34;取决于用户定义的类型&#34; (一个更好的术语,希望将被采用,是程序定义的类型)和&#34;满足原始模板的标准库要求。&#34;您的示例符合第一个条件,但会破坏第二个条件,因此它的未定义行为。
但是,如果您继续填写其余要求(请参阅[container.requirements]和[sequence.reqmts]和[vector])以符合第二个标准,那么它将会是精细。但值得怀疑。只需编写自己的容器,最少惊喜的原则和所有这些。当人们看到std::vector<T>
时,他们认为它实际上是std::vector
。 std::vector<bool>
已经够糟糕了,不要添加另一个。