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

时间:2011-01-12 19:16:47

标签: c++ type-safety

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

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

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

typedef int X; typedef int Y; 

void foo(X,Y); 

X x; Y y; 

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

3 个答案:

答案 0 :(得分:12)

您必须创建包装类。假设您有两个不同的单位(比如秒和分钟),两者都表示为整数。你需要类似下面的东西才能完全类型化:

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

private:
    int myMinute;
};

和类似的类秒。显式构造函数可以防止您意外地将int用作Minute,但转换运算符允许您在需要Minute的任何位置使用int

答案 1 :(得分:4)

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

根据您要实现的目标,一种可能性是使用enum。这也不是完全类型安全的,但它更接近。例如,如果不将其转换为枚举参数,则无法将int传递给它。

答案 2 :(得分:-5)

获取便利贴。用大字写上“X先!然后!”将它贴在电脑屏幕上。老实说,我不知道还有什么建议。当问题可以用post-it和魔术标记来解决时,使用包装类肯定是矫枉过正的。