|
|
Serialization
|
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.
BOOST_STRONG_TYPEDEF
has been designed to be similar to the standard
typedef. So
BOOST_STRONG_TYPEDEF(type, name)
will create a new type "name" which will be substitutable for the original
type but still of distinct type.
The wrapped type need not be a primitive one. It has to be default
constructible, copyable and assignable, and to provide
== and
<, from which the remaining
comparisons are generated.
BOOST_STRONG_TYPEDEF is a macro
which generates a class named "name" which wraps an instance of the
type and provides appropriate conversion operators in order
to make the new type substitutable for the one that it wraps. The
generated class copies and moves as the wrapped type does, so wrapping a
type which is cheaper to move than to copy costs nothing.
© 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)