а) 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>>