如何在C ++中为原始类型创建易于使用的类型检查别名?

时间:2017-09-13 22:16:40

标签: c++ c++11 types typedef

我正在编写代码,我正在为基本类型创建多个别名,例如: 地址 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要使这个问题成为一个具体的问题,而不是讨论:我只是要求一种不同的方式来实现我想要的结果,而不是重载一切。谢谢。

1 个答案:

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