C++ 如何在C++;?
我正在编写代码,为基本类型创建多个别名,例如地址和Id为int 我希望避免同时使用地址和ID,例如在算术运算中 因此,我希望对这些别名进行类型检查,以便获得以下结果: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
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.哦,是的,这是一个有效的观点,阿尔及达斯的解决方案对无意义的操作没有限制。我想我会手动重载所选的操作符。非常感谢。