Aug 29, 2013

[C++][NOTE][ORIGINAL] Strong typedef

typedef does _not_ creates new type,

but sometimes, we really want _the_ same type but

with different _type_. Ok, it's a bit wordy.



Let's put it this way, define function signatures:


typedef float ft_t;

void float_me(float){};
void float_me(ft_t){};

These will violate the One Definition Rule(ODR).
We can declare a function many times(asking to import function symbol during the linking stage), but only one definition is allowed.

What if, we really need to take the same type but with different _type_?
This is really useful for compile time checking and , well,
database query programming. (i.e get/set different properties but actually with same type underneath)

e.g:

#include <string>
#include <memory>
#include <boost/serialization/strong_typedef.hpp>


//Won't introduce new type; only type alias.
typedef std::string FirstName_t;
typedef std::string SecondName_t;

struct Panda
{
   FirstName_t FirstName;
   SecondName_t SecondName;
};


template<typename T>
struct firstname_alloc : std::allocator<T> { };

template<typename T>
struct secondname_alloc : std::allocator<T> { };


struct Panda_Adv_1
{
   std::basic_string<char, std::char_traits<char>, firstname_alloc<char> > FirstName;
   std::basic_string<char, std::char_traits<char>, secondname_alloc<char> > SecondName;
};


BOOST_STRONG_TYPEDEF(std::string, FirstName_bt)
BOOST_STRONG_TYPEDEF(std::string, SecondName_bt)

struct Panda_Adv_2
{
    FirstName_bt FirstName;
    SecondName_bt SecondName;
};



int main(){

   Panda p1 = {"Yuan_Zai", "Ha"};
   //This compiles since both are std::string type;
   p1.FirstName = p1.SecondName;

/* Won't Compile due to no implicit type conversion between
 * std::basic_string<char, std::char_traits<char>, firstname_alloc<char> > 
 * std::basic_string<char, std::char_traits<char>, secondname_alloc<char> >
   Panda_Adv_1 p2 = {"Yuan_Zai", "Ha"};
   p2.FirstName = p2.SecondName;
*/

/* Won't compile due to the same reason, but using
 * Boost's strong_typedef
   Panda_Adv_2 p3 = {"Yuan_Zai", "Ha"};
   p3.FirstName = p3.SecondName;
*/
}



stacked-crooked on-line code

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.