我正在编写代码,我正在为基本类型创建多个别名,例如: 地址和 Id 是 int s。
我想避免一起使用地址和ID,例如在算术运算中。
因此,我希望对这些别名进行类型检查,以便获得以下结果:
typedef int A;
typedef int B;
A f(A a) { return a+a; };
int main()
{
A a = 5;
B b = 5;
f(a); // I would like this to work...
f(b); // and this not to compile.
}
现在这不起作用,但我知道我可以使用只有一个成员的包装结构/类:
class A { public: int x; A(int xx) { x = xx; }};
class B { public: int x; B(int xx) { x = xx; }};
A f(A a) { return A(a.x+a.x); }; // this is ugly and I'd want to be able to use: return a+a
int main()
{
A a = 5;
B b = 5;
f(a); // This will work...
f(b); // This won't compile...
}
我的问题是 - 我可以像第二个代码段一样使代码工作的最佳方式是什么,但无需一直明确地获取 x 并构建新对象(正如“这是丑陋的”评论中所述?
我想我可以为所有'别名'重载所有相关的操作符,但这是很多工作,我希望有更快/更好的解决方案。
感谢。
PS要使这个问题成为一个具体的问题,而不是讨论:我只是要求一种不同的方式来实现我想要的结果,而不是重载一切。谢谢。
答案 0 :(得分:1)
我不知道“最佳”方式,但您可以做的一件事是创建一个类型,它会重载所有相关的运算符并采用一个完整的模板参数,以便您可以区分类型一个数字:
template<std::size_t ID>
class strongly_typed_int
{
public:
explicit strongly_typed_int(int i = 0): i(i) {}
// ...
strongly_typed_int operator+(strongly_typed_int i) { /*...*/ }
// etc...
private:
int i;
};
using security_id = strongly_typed_int<0>;
using access_code = strongly_typed_int<1>;
// etc...