如何在C++中为基元类型创建好用的类型检查别名?

如何在C++中为基元类型创建好用的类型检查别名?

问题描述:

我正在编写代码,我正在为原始类型创建多个别名,例如, 地址Idint 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问题,而不是讨论:我只是要求以不同的方式实现我想要的结果,而不是重载所有内容。谢谢。

+1

'//这是丑陋的,我希望能够使用:return a + a'那么,为什么不重载'operator int()'? [实施例](https://ideone.com/VKA0​​DO)。 –

+1

那么可以添加两个ID吗?如果结果再次成为ID?乘法怎么样,你想要ID平方? –

+1

另请参阅https://stackoverflow.com/questions/34287842/c-strongly-typed-using-and-typedef等。 –

我不知道“最好”的方式,但有一件事你可以做的是创造一个类型重载所有相关的运营商,并采取不可或缺的模板参数,所以你可以用一些与众不同的类型:

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...