我使用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);
}
Run Code Online (Sandbox Code Playgroud)
此代码编译,即使fa
期望类型的参数A
.显然,A
并且B
是相同的.
使这段代码正确编译的最简单方法是什么:
fa(ax);
fb(bx);
Run Code Online (Sandbox Code Playgroud)
并使此代码失败:
fa(bx);
fb(ax);
Run Code Online (Sandbox Code Playgroud)
当然,我可以std::vector<int>
在另一个类中包装,但是我需要重写它的接口.或者,我可以继承std::vector<int>
,但这通常是气馁的.
简而言之,我需要两个不兼容的版本std::vector<int>
.
编辑
有人建议Strong typedef可以解决这个问题.这只是部分正确.如果我使用BOOST_STRONG_TYPEDEF(std::vector<int>, A)
,我需要添加一些恼人的演员阵容.例如,而不是
A ax{1,3,5};
Run Code Online (Sandbox Code Playgroud)
我需要用
A ax{std::vector<int>{1,3,5}};
Run Code Online (Sandbox Code Playgroud)
而不是
for (auto x : ax) ...
Run Code Online (Sandbox Code Playgroud)
我需要用
for (auto x : (std::vector<int>)ax) ...
Run Code Online (Sandbox Code Playgroud)
Chr*_*ann 60
我认为你想要的仍然是最好的:
struct A : public std::vector<int>{
using vector::vector;
};
struct B : public std::vector<int>{
using vector::vector;
};
Run Code Online (Sandbox Code Playgroud)
它完全符合你的要求.为了避免干净的陈述,没有理由想出一些丑陋的hackery.我认为这种子类型不受欢迎的主要原因是相同的事物应该表现得像它们是相同的并且可以互换使用.但这正是你想要压缩的东西,因此它的子类型恰好就是你想要的语句:它们具有相同的接口,但它们不应该被使用,因为它们不相同.
Bar*_*rop 14
无论如何,这是一种原始的痴迷.无论是int
s真的代表什么,vector
s是这个东西的集合,或者vector<int>
s代表某种东西.
在这两种情况下,都应该通过将原语包装成更有意义的东西来解决.例如:
class column
{
int id;
/*...*/
};
class row
{
int id;
/*...*/
};
Run Code Online (Sandbox Code Playgroud)
std::vector<row>
并且std::vector<column>
不可互换.
当然,相同的想法可以应用于,vector<int>
而不是int
,如果vector<int>
原始真正意味着其他东西.