我知道我无法从一个int派生而且甚至没有必要,这只是我想到的一个(非)解决方案。
我有一对(foo,bar)
,两者都由int
在内部表示,但我希望typeof(foo)
与typeof(bar)
无法比较。这主要是为了防止我将(foo,bar)
传递给期望(bar, foo)
的函数。如果我理解正确,typedef
将不会这样做,因为它只是一个别名。最简单的方法是什么?如果我要为foo
和bar
创建两个不同的类,那么明确提供int
支持的所有运算符将非常繁琐。我想避免这种情况。
答案 0 :(得分:18)
作为自行编写的替代方法,您可以使用boost/strong_typedef.hpp
标题中提供的BOOST_STRONG_TYPEDEF
宏。
// macro used to implement a strong typedef. strong typedef
// guarentees that two types are distinguised even though the
// share the same underlying implementation. typedef does not create
// a new type. BOOST_STRONG_TYPEDEF(T, D) creates a new type named D
// that operates as a type T.
所以,例如。
BOOST_STRONG_TYPEDEF(int, foo)
BOOST_STRONG_TYPEDEF(int, bar)
答案 1 :(得分:10)
template <class Tag>
class Int
{
int i;
public:
Int(int i):i(i){} //implicit conversion from int
int value() const {return i;}
operator int() const {return i;} //implicit convertion to int
};
class foo_tag{};
class bar_tag{};
typedef Int<foo_tag> Foo;
typedef Int<bar_tag> Bar;
void f(Foo x, Bar y) {...}
int main()
{
Foo x = 4;
Bar y = 10;
f(x, y); // OK
f(y, x); // Error
}
答案 2 :(得分:1)
你是对的,你不能用typedef
来做。但是,您可以将它们包裹在struct-enum
对或int
封装在struct
内。
template<int N>
struct StrongType { // pseudo code
int i;
StrongType () {}
StrongType (const int i_) : i(i_) {}
operator int& () { return i; }
StrongType& operator = (const int i_) {
i = i_;
return *this;
}
//...
};
typedef StrongType<1> foo;
typedef StrontType<2> bar;
C ++ 0x解决方案:
enum class foo {};
enum class bar {};