| 1 | //Purpose:
|
|---|
| 2 | // Demonstrate the EBCO problem mentioned here in thread:
|
|---|
| 3 | // http://lists.boost.org/boost-users/2008/09/40552.php
|
|---|
| 4 | //Result:
|
|---|
| 5 | // Problem doesn't occur with gcc snapshot:
|
|---|
| 6 | // ftp://gcc.gnu.org/pub/gcc/snapshots/4.4-20090519/gcc-4.4-20090519.tar.bz2
|
|---|
| 7 | //
|
|---|
| 8 |
|
|---|
| 9 | #include <boost/mpl/transform.hpp>
|
|---|
| 10 | #include <boost/mpl/always.hpp>
|
|---|
| 11 | #include <boost/mpl/range_c.hpp>
|
|---|
| 12 | #include <boost/mpl/front_inserter.hpp>
|
|---|
| 13 | #include <boost/fusion/include/vector.hpp>
|
|---|
| 14 | #include <boost/fusion/include/mpl.hpp>
|
|---|
| 15 |
|
|---|
| 16 | #include <iostream>
|
|---|
| 17 | #include <typeinfo>
|
|---|
| 18 |
|
|---|
| 19 | namespace boost{namespace mpl{
|
|---|
| 20 | template
|
|---|
| 21 | < typename T
|
|---|
| 22 | , typename Inserter
|
|---|
| 23 | , unsigned Size=0
|
|---|
| 24 | >
|
|---|
| 25 | struct insert_same_repeat
|
|---|
| 26 | /**@brief
|
|---|
| 27 | * Repeat Inserter Size times on same value, T.
|
|---|
| 28 | *
|
|---|
| 29 | * The body of this template is essentially
|
|---|
| 30 | * a copy of Steven's code in the thread
|
|---|
| 31 | * mentioned in Purpose: above.
|
|---|
| 32 | */
|
|---|
| 33 | {
|
|---|
| 34 | // create a sequence of Size elements:
|
|---|
| 35 | typedef boost::mpl::range_c<int, 0, Size> range;
|
|---|
| 36 | // convert all the elements to T with Inserter:
|
|---|
| 37 | typedef typename boost::mpl::transform
|
|---|
| 38 | <range, boost::mpl::always<T>, Inserter>::type
|
|---|
| 39 | type;
|
|---|
| 40 | };
|
|---|
| 41 |
|
|---|
| 42 | }}
|
|---|
| 43 |
|
|---|
| 44 | int main() {
|
|---|
| 45 | unsigned const count=2;
|
|---|
| 46 | typedef
|
|---|
| 47 | boost::mpl::insert_same_repeat
|
|---|
| 48 | < float
|
|---|
| 49 | , boost::mpl::front_inserter<boost::fusion::vector<> >
|
|---|
| 50 | , count
|
|---|
| 51 | >::type
|
|---|
| 52 | float_container_type;
|
|---|
| 53 | float_container_type float_container_valu;
|
|---|
| 54 | std::size_t size_float=sizeof(float);
|
|---|
| 55 | std::cout << typeid(float_container_type).name() << std::endl;
|
|---|
| 56 | std::cout << "count*sizeof(float)="<<count*size_float<< std::endl;
|
|---|
| 57 | std::cout << "sizeof(float_container_type)="<<sizeof(float_container_type)<< std::endl;
|
|---|
| 58 | }
|
|---|