在C ++中声明没有隐式转换的类型

时间:2010-02-04 13:40:56

标签: c++

我想声明自己的数字类型,与unsigned int完全相同,但我不希望隐式转换类型。我先试了一下:     typedef unsigned int firstID;     typedef unsigned int secondID;

但这并不好,因为这两种类型只是unsigned int的同义词,因此可以自由地互换。

我希望这会导致错误:

firstID fid = 0;
secondID sid = fid; // no implicit conversion error

但这没关系:

firstID fid = 0;
secondID sid = static_cast<secondID>(fid); // no error

我的理由是函数参数是强类型的,例如:

void f( firstID, secondID ); // instead of void f(unsigned int, unsigned int)

我在寻找什么机制?

由于

的Si

5 个答案:

答案 0 :(得分:7)

也许BOOST_STRONG_TYPEDEF表单boost/strong_typedef.hpp会有所帮助。

答案 1 :(得分:3)

正如您所说:typedef命名错误(它应该是typealias(D已明确添加了typealias(上次我看过))

因此,唯一可以做到这一点的方法是创建两个独特的类 我不是说你不能写一个static_cast&lt;&gt;的专业化做你想做的事情,但我认为(我还没有考虑过这么多)这样做会是一个坏主意(即使它是合法的),我认为更好的方法是让每个类构造函数使用unsigned int这是明确的(所以没有自动转换)。

 struct FID
 {
     explicit FID(unsigned int v): value(v) {}
     operator unsigned int() {return value;}
     unsigned int value;
 };

 class SID {/* Stuff */};

 FID   fid(1U);
 SID   sid(2U);

 doSomthingWithTwoSID(sid,SID(static_cast<unsigned int>(fid));

使构造函数显式表示类型之间没有自动转换 通过将内置的强制转换操作符添加到unsigned int意味着它可以在任何需要int的地方使用。

答案 2 :(得分:2)

你必须为它们编写自己的类,重新实现你需要的所有操作符。

答案 3 :(得分:1)

啊,啊,我看到的阿达旅行家。

在C ++中执行此操作的唯一方法是声明类。类似的东西:

class first_100 {
public:
    explicit first_100(int source) {
        if (source < 1 || source > 100) {
           throw range_error;
        }
        value = source;
    };
    // (redefine *all* the int operators here)
private:
    int value;
};

您需要确保定义int构造函数explicit,以便C ++不会使用它来隐式转换您的类型。这样做不起作用:

first_100 centum = first_100(55);
int i = centum;

但是这样的事情可能(假设你定义它):

int i = centum.to_int();

答案 4 :(得分:1)

struct FirstID { int id; };