我可以阻止int typedef隐式转换为int吗?

时间:2017-03-27 18:35:06

标签: c++ casting

我希望以下内容不能编译。

typedef int relative_index_t;  // Define an int to only use for indexing.
void function1(relative_index_t i) {
  // Do stuff.
}

relative_index_t y = 1; function1(y);  // I want this to build.
int x = 1; function1(x);               // I want this to NOT build!

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:5)

typedef无法做到这一点。

请改用以下代码:

enum class relative_index_t : int {};

使用示例:

int a = 0;
relative_index_t b;
b = (relative_index_t)a; // this doesn't compile without a cast
a = (int)b; // this too

如果您更喜欢C ++风格的演员表,请关注以下内容:

int a = 0;
relative_index_t b;
b = static_cast<relative_index_t>(a);
a = static_cast<int>(b);

您也可以使用BOOST_STRONG_TYPEDEF (Credits to @AlexanderPoluektov)

答案 1 :(得分:0)

一种技术借用Modula-2的不透明类型:

typedef struct {
              int  index;
        } relative_index_t;

这可能足以防止使用int转换。它还允许另一个成员变量允许其他功能,如年龄,序列号生成,边界检查等。