long float data c++ typechecking

float - long int c++



Derivando tipos diferentes e incomparables de int en C++ (3)

Como alternativa a escribirlo usted mismo, puede usar la macro BOOST_STRONG_TYPEDEF disponible en el encabezado boost/strong_typedef.hpp .

// 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.

Entonces, por ejemplo

BOOST_STRONG_TYPEDEF(int, foo) BOOST_STRONG_TYPEDEF(int, bar)

Sé que no puedo derivar de un int y ni siquiera es necesario, esa fue solo una (no) solución que vino a mi mente para el problema a continuación.

Tengo un par (foo,bar) los cuales están representados internamente por un int pero quiero que typeof(foo) sea ​​incomparable con typeof(bar) . Esto es principalmente para evitar que pase (foo,bar) a una función que espera (bar, foo) . Si lo comprendo correctamente, typedef no lo hará, ya que solo es un alias. ¿Cuál sería la forma más fácil de hacer esto? Si tuviera que crear dos clases diferentes para foo y bar , sería tedioso proporcionar explícitamente todos los operadores admitidos por int . Quiero evitar eso.


Tienes razón, que no puedes hacerlo con typedef . Sin embargo, puede envolverlos en un par struct-enum o int encapsulado dentro de 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 solución :

enum class foo {}; enum class bar {};


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 }