C++ c++;:使用类型安全性区分两个int参数的类型

C++ c++;:使用类型安全性区分两个int参数的类型,c++,type-safety,C++,Type Safety,我有两个int参数的各种函数(我自己编写函数和调用代码)。我害怕在一些电话中混淆争论的顺序 如果我使用错误的参数序列(所有参数都是int)调用函数,如何使用类型安全性让编译器警告我或出错 我尝试了typedefs:Typedef不会触发任何编译器警告或错误: typedef int X; typedef int Y; void foo(X,Y); X x; Y y; foo(y,x); // compiled without warning) typedef创建类型别名。正如你所发

我有两个int参数的各种函数(我自己编写函数和调用代码)。我害怕在一些电话中混淆争论的顺序

如果我使用错误的参数序列(所有参数都是int)调用函数,如何使用类型安全性让编译器警告我或出错

我尝试了typedefs:Typedef不会触发任何编译器警告或错误:

typedef int X; typedef int Y; 

void foo(X,Y); 

X x; Y y; 

foo(y,x); // compiled without warning)

typedef
创建类型别名。正如你所发现的,那里没有类型安全


一种可能性是使用
enum
,这取决于您试图实现的目标。这也不是完全的类型安全,但更接近。例如,如果不强制转换,就不能将int传递给enum参数。

您必须创建包装类。假设您有两个不同的单位(例如秒和分钟),它们都表示为整数。您需要以下内容才能完全实现类型安全:

class Minute
{
public:
    explicit Minute(int m) : myMinute(m) {}
    operator int () const { return myMinute; }

private:
    int myMinute;
};

和一个类似的课程,持续几秒钟。显式构造函数防止您意外地将
int
用作
Minute
,但转换运算符允许您在需要
int
的任何地方使用
Minute
,以获取便利贴。用大写字母写在上面,“先X!然后Y!”把它贴在电脑屏幕上。老实说,我不知道还有什么好建议。使用包装器类肯定是过火了,因为问题可以通过post-it和魔术标记来解决。

要获得更完整、更通用的实现,您还可以查看一下,您可能会发现类似这样的有用信息:询问地理软件的开发人员。是拉/长还是长/拉?这是一个典型的情况,其中包装器类可以工作,而post类则不行。