【问题标题】:c++: using type safety to distinguish types oftwo int argumentsc++:使用类型安全来区分两个 int 参数的类型
【发布时间】:2011-06-08 01:31:38
【问题描述】:

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

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

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

typedef int X; typedef int Y; 

void foo(X,Y); 

X x; Y y; 

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

【问题讨论】:

标签: c++ type-safety


【解决方案1】:

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

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

private:
    int myMinute;
};

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

【讨论】:

【解决方案2】:

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

根据您要实现的目标,一种可能性是使用enum。这也不是完全类型安全的,但更接近。例如,您不能将 int 传递给枚举参数而不进行强制转换。

【讨论】:

    【解决方案3】:

    获取便利贴。在上面用大写字母写:“X FIRST!然后 Y!”把它贴在你的电脑屏幕上。老实说,我不知道还有什么建议。当问题可以用便利贴和魔术标记解决时,使用包装类肯定是大材小用。

    【讨论】:

    • 请教地理软件的开发者。它是纬度/经度还是经度/纬度?一个经典案例,其中包装类可以工作,但不能发布。
    猜你喜欢
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多