如何在C++中为基元类型创建好用的类型检查别名?
问题描述:
我正在编写代码,我正在为原始类型创建多个别名,例如, 地址和Id是int s。如何在C++中为基元类型创建好用的类型检查别名?
我想避免将地址和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所有的T ime并构建新的对象(正如在“这是丑陋的评论”中注明的那样)?
我想我可以为所有“别名”重载所有相关的运算符,但这是很多工作,我希望有一个更快/更好的解决方案。
谢谢。
PS为了使这成为一个具体的SO问题,而不是讨论:我只是要求以不同的方式实现我想要的结果,而不是重载所有内容。谢谢。
答
我不知道“最好”的方式,但有一件事你可以做的是创造一个类型重载所有相关的运营商,并采取不可或缺的模板参数,所以你可以用一些与众不同的类型:
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...
'//这是丑陋的,我希望能够使用:return a + a'那么,为什么不重载'operator int()'? [实施例](https://ideone.com/VKA0DO)。 –
那么可以添加两个ID吗?如果结果再次成为ID?乘法怎么样,你想要ID平方? –
另请参阅https://stackoverflow.com/questions/34287842/c-strongly-typed-using-and-typedef等。 –