【发布时间】:2016-12-23 11:13:18
【问题描述】:
我将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> 版本。
编辑
有人建议Strong typedefs可以解决这个问题。这只是部分正确。如果我使用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) ...
【问题讨论】:
-
与其将整个
std::vector<int>包装在另一个类中,不如将int包装成更有意义的东西呢? -
Strong typedefs的可能重复
-
你能给我们一些背景信息吗?通常我会回答特定于 A 和 B 应该是什么的事情。也就是说,经常使用 std::vector 会创建不应该插入到函数其他部分的向量,这很明显,对吧?就像定义不应插入排序算法的顺序的向量一样。所以,我真的不明白为什么你需要它们不兼容。当然,你会有一些理由,我真的很想听听他们的意见。它们可能是您问题的关键。
-
@Aziuth,向量用于保存游戏中位置的两种不同表示。一种表示对某些计算有用,另一种表示对其他计算有用。我想确保不使用表示 B 调用期望表示 A 的函数。
-
“或者,我可以从 std::vector
继承,但经常不鼓励这样做。” Pfft,这里没有错。你不打算动态分配你的类型,或者向它添加数据成员,是吗?不,所以只需从std::vector<int>公开继承来创建自己的类型并完成它。