typedef vs public наследование
От: Ыукпун  
Дата: 06.01.05 11:43
Оценка:
а)        typedef CBase type;


б)        class type : publc CBase {};


По идее type в обоих случаях должен получиться одинаковым. И совпадать с CBase.

Проверил на двух компиляторах (VC++ 7.1 и GNU Dev-C++) следующий код:

#include <boost\mpl\apply.hpp>
#include <boost\mpl\list.hpp>
#include <boost\mpl\lambda.hpp>
#include <boost\mpl\fold.hpp>
#include <boost\mpl\int.hpp>
#include <boost\mpl\placeholders.hpp>
namespace mpl = boost::mpl;

struct CClass
{
    void Init(int& i){i--;};
};

namespace impl
{
    template<typename TBase> struct CClass0:public TBase {
    public:  void Init(int& i){i--;    TBase::Init(i);};
    };
    template<typename TBase> struct CClass1:public TBase {
    public:  void Init(int& i){i--;    TBase::Init(i);}
    ;};
}

typedef mpl::lambda<impl::CClass0<mpl::_> >::type CClass0;
typedef mpl::lambda<impl::CClass1<mpl::_> >::type CClass1;

class ListOfTypes:public mpl::list<CClass0,CClass1>{};

template <typename T1, typename T2> struct CMetaFunction1
{
    struct type1: public mpl::apply<T2, T1>::type{};
    typedef type1 type;
};

template <typename T1, typename T2> struct CMetaFunction2
{
    struct type: public mpl::apply<T2, T1>::type{};
};

class CBase
{
public:
    CBase(void)
    {
        {
        mpl::fold<ListOfTypes, CClass, CMetaFunction1<mpl::_, mpl::_> >::type g;
        int i=5;
        g.Init(i);
        }
        {
        mpl::fold<ListOfTypes, CClass, CMetaFunction2<mpl::_, mpl::_> >::type g;
        int i=5;
        g.Init(i);
        }
    }
    ~CBase(void){};
};


// Пояснение 
// Есть шаблонные классы CClass0 и CCLass1.
// Шаблонный параметр используют как предка
// Все имеют функцию Init(int & i); которая вызывает такую же функцию у предка.
// 
// Цель, получить цепочку наследования
// 
// CClass1 <-  CClass0 <- CClass


Соответствено при вызове Init() хочется получить последовательность действий:
CClass1.Init()
CClass0.Init()
CClass.Init()

При использовании fold разница только в метафункциях, а результат разный.

В первом случае все работает корректно
Во втором случае работает так:

CClass0.Init()
CClass.Init()

Может кто подскажет в чем причина?
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.