我使用std::vector<int>
两种不同的信息。我想确保我不会意外地将两种用途混合使用。
简而言之,我想使这段代码失败:
#include <vector>
using A = std::vector<int>;
using B = std::vector<int>;
void fa(const A&);
void fb(const B&);
void fun()
{
A ax;
B bx;
fa(bx);
fb(ax);
}
即使fa
期望类型为的参数,该代码也会编译A
。显然,A
并且B
是相同的。
使此代码正确编译的最简单方法是什么:
fa(ax);
fb(bx);
并使此代码失败:
fa(bx);
fb(ax);
当然,我可以包装std::vector<int>
在另一个类中,但是随后我需要重写其接口。或者,我可以从继承std::vector<int>
,但是通常不建议这样做。
简而言之,我需要两个不兼容的版本std::vector<int>
。
编辑
已经提出,强类型定义可以解决此问题。这只是部分正确。如果使用BOOST_STRONG_TYPEDEF(std::vector<int>, A)
,我需要添加一些烦人的演员表。例如,代替
A ax{1,3,5};
我需要用
A ax{std::vector<int>{1,3,5}};
而不是
for (auto x : ax) ...
我需要用
for (auto x : (std::vector<int>)ax) ...
我认为您想要的仍然可以通过以下方式获得最佳实现:
struct A : public std::vector<int>{
using vector::vector;
};
struct B : public std::vector<int>{
using vector::vector;
};
它正是您想要的。没有理由仅仅为了避免发表明确声明而提出一些丑陋的黑客手段。我看到不喜欢这种子类型的主要原因是,相同的事物应表现为相同的事物,并且可以互换使用。但这正是您要抑制的内容,因此对它进行子类型化即可准确地表达所需的语句:它们具有相同的接口,但不应使用相同的接口,因为它们不相同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句