读书人

模板编程有关问题

发布时间: 2012-03-30 17:32:09 作者: rapoo

求一个模板编程问题
我想写一个数组,里面可以存放任意类型的数据。但是不会实现。求高手指导啊~


代码如下:

C/C++ code
#include <vector>class Base{};//都继承Baseclass A:public Base{};class B:public Base{};class C:public Base{};enum{    enum_A = 0,//分别都对应A,B,C。    enum_B,    enum_C,    enum_max};template<int Tcount>class Array{    Base* m_BaseArray[Tcount];public:    Array()    {        for (int i = 0 ;i  < Tcount; ++i)        {            m_BaseArray[i] = NULL;        }    }    int static_size() {return Tcount;}    template<int type_id,class TypeData>    void insert(TypeData& data)    {        m_BaseArray[type_id] = &data;    }    //能不能预先做下处理,这里直接返回继承类的类型。    Base& operator[] (int index)    {        return *m_BaseArray[index];    }    };int main(){    Array<enum_max> arr;        arr.insert<enum_A>(A());    arr.insert<enum_B>(B());    arr.insert<enum_C>(C());    //这里的arr[1]是class Base。我希望可以得到class B。    arr[1];}


[解决办法]
boost::any
[解决办法]
#include "iostream"


class Base{
public:
virtual void echo(){ std::cout<<"I'm base"<<std::endl; }
};
//都继承Base
class A:public Base{
public:
void echo(){ std::cout<<"I'm A"<<std::endl; }
};
class B:public Base{
public:
void echo(){ std::cout<<"I'm B"<<std::endl; }
};
class C:public Base{
public:
void echo(){ std::cout<<"I'm C"<<std::endl; }
};

enum
{
enum_A = 0,//分别都对应A,B,C。
enum_B,
enum_C,
enum_max
};

template<int Tcount>
class Array
{
Base* m_BaseArray[Tcount];
public:
Array()
{
for (int i = 0 ;i < Tcount; ++i)
{
m_BaseArray[i] = NULL;
}
}

int static_size() {return Tcount;}
template<int type_id,class TypeData>
void insert(TypeData& data)
{
m_BaseArray[type_id] = &data;
}

//能不能预先做下处理,这里直接返回继承类的类型。
template<class TypeData>
TypeData& getElement (int index)
{
return *(dynamic_cast<TypeData*>(m_BaseArray[index]));
}

};


int main(int argc, _TCHAR* argv[])
{
Array<enum_max> arr;

arr.insert<enum_A>(A());
arr.insert<enum_B>(B());
arr.insert<enum_C>(C());

//结果 I'm B。
arr.getElement<B>(1).echo() ;


return 0;
}
[解决办法]
#include "iostream"


class Base{
public:
virtual void echo(){ std::cout<<"I'm base"<<std::endl; }
};
//都继承Base
class A:public Base{
public:
void echo(){ std::cout<<"I'm A"<<std::endl; }
};
class B:public Base{
public:
void echo(){ std::cout<<"I'm B"<<std::endl; }
};
class C:public Base{
public:
void echo(){ std::cout<<"I'm C"<<std::endl; }
};

enum
{
enum_A = 0,//分别都对应A,B,C。
enum_B,
enum_C,
enum_max
};

template<int Tcount>
class Array
{
Base* m_BaseArray[Tcount];
public:
Array()
{
for (int i = 0 ;i < Tcount; ++i)
{
m_BaseArray[i] = NULL;
}
}

int static_size() {return Tcount;}


template<int type_id,class TypeData>
void insert(TypeData& data)
{
m_BaseArray[type_id] = &data;
}

//能不能预先做下处理,这里直接返回继承类的类型。
template<class TypeData>
TypeData& getElement (int index)
{
return *(dynamic_cast<TypeData*>(m_BaseArray[index]));
}

//能不能预先做下处理,这里直接返回继承类的类型。
Base& operator[] (int index)
{
return *((m_BaseArray[index]));
}
};


int main(int argc, _TCHAR* argv[])
{
Array<enum_max> arr;

arr.insert<enum_A>(A());
arr.insert<enum_B>(B());
arr.insert<enum_C>(C());

//result : I'm B。
arr.getElement<B>(1).echo() ;

//result : I'm B。
arr[1].echo();

return 0;
}

读书人网 >C++

热点推荐