我想声明自己的数字类型,与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
答案 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; };