C++ 如何在C++;?

C++ 如何在C++;?,c++,c++11,types,typedef,C++,C++11,Types,Typedef,我正在编写代码,为基本类型创建多个别名,例如地址和Id为int 我希望避免同时使用地址和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 t

我正在编写代码,为基本类型创建多个别名,例如地址和Id为int

我希望避免同时使用地址和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并构造新对象(如“这是丑陋的”注释中所述)的最佳方式是什么

我想我可以为我的所有“别名”重载所有相关运算符,但这需要大量工作,我希望有一个更快/更好的解决方案

谢谢

让这成为一个具体的问题,而不是一个讨论:我只是要求用一种不同的方式来实现我想要的结果,而不是让一切都超载。谢谢。

我不知道“最好”的方法是什么,但您可以做的一件事是创建一个类型,该类型重载所有相关运算符并采用整数模板参数,这样您就可以用一个数字来区分您的类型:

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...
模板
类强类型
{
公众:
显式强类型(inti=0):i(i){
// ...
强类型算子+(强类型算子i){/*…*/}
//等等。。。
私人:
int i;
};
使用安全性\u id=强类型\u int;
使用access\u code=强类型\u int;
//等等。。。

//这很难看,我希望能够使用:返回a+a
那么,为什么不重载
操作符int()
。那么添加两个ID可以吗?结果应该是一个ID吗?关于乘法,你想得到ID平方吗?另请参见等人。@AlgirdasPreidžius-非常感谢。我不知道你能做那样的事。我想这适用于任何基元类型?@n.m.哦,是的,这是一个有效的观点,阿尔及达斯的解决方案对无意义的操作没有限制。我想我会手动重载所选的操作符。非常感谢。