###

# Serialization

## `BOOST_STRONG_TYPEDEF`

### Motivation

`typedef` creates an alias for an existing type. It does not create a new type that can be used for matching either function or template parameters. This can be shown by trying to compile the following example.

    typedef int a;
    void f(int x);  // (1) function to handle simple integers
    void f(a x);    // (2) special function to handle integers of type a
    int main(){
        int x = 1;
        a y;
        y = x;      // other operations permitted as a is converted as necessary
        f(x);       // chooses (1)
        f(y);       // chooses (2)
    }

Since typedef doesn't create a new type, this program can't compile to code that implements its obvious intention.

Usage of BOOST_STRONG_TYPEDEF addresses this.

    #include <boost/serialization/strong_typedef.hpp>

    BOOST_STRONG_TYPEDEF(int, a)
    void f(int x);  // (1) function to handle simple integers
    void f(a x);    // (2) special function to handle integers of type a
    int main(){
        int x = 1;
        a y;
        y = x;      // other operations permitted as a is converted as necessary
        f(x);       // chooses (1)
        f(y);       // chooses (2)
    }

The program will now compile and run as expected.

### Usage

Syntax of `BOOST_STRONG_TYPEDEF` has been designed to be similar to the standard `typedef`. So

    BOOST_STRONG_TYPEDEF(primitive type, name)

will create a new type "name" which will be substitutable for the original type but still of distinct type.

### Implemenation

`BOOST_STRONG_TYPEDEF` is a macro which generates a class named "name" which wraps an instance of its primitive type and provides appropriate conversion operators in order to make the new type substitutable for the one that it wraps.

© Copyright Robert Ramey 2002-2004. Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)