我正在为游戏世界中的一些对象创建一个统计编辑器。我没有为每种对象类型提供多个编辑菜单,而是只有一个菜单,并传入一个stat- edit -objects列表/向量,其中包含一个指向正在编辑的stat的指针,以及完成这项工作的函数。
struct StatEditObjPureBase
{
std::vector<std::string> reps;
std::string name;
std::basic_string<int> value;
const iWindow* win;
Editor* pE;
StatEditObjPureBase(iWindow& rIW, Editor& rE) : win(&rIW), pE(&rE) {}
virtual ~StatEditObjPureBase() = 0;
virtual StatEditObjPureBase* clone() = 0;
virtual void set() = 0;
virtual void dec() = 0;
virtual void inc() = 0;
virtual void update() = 0;
};
struct StatEditObjWrap
{
StatEditObjPureBase* base;
StatEditObjWrap(StatEditObjPureBase* p) : base(p) {}
StatEditObjWrap(const StatEditObjWrap& that) { base = that.base->clone(); }
~StatEditObjWrap() { delete base; }
};
template<class T> struct StatEditObj_INT : StatEditObjPureBase
{
T* pMain;
StatEditObj_INT(T* p, iWindow& rIW, Editor& rE) : StatEditObjPureBase(rIW, rE), pMain(p) {}
StatEditObj_INT* clone() { return new StatEditObj_INT(*this); }
void set();
void dec(){--(*pMain);}
void inc(){++(*pMain);}
void update();
};
template<class T> void StatEditObj_INT<T>::set()
{
*pMain = input_getInt(win->box_input_y, win->box_input_x, win->box_input_range, win->box_input_fg, win->box_input_bg);
}
template<class T> void StatEditObj_INT<T>::update()
{
staticStatEditObj_intUpdate(*pMain, value, reps);
}我的主要问题是必须指出变量的类型,该变量的指针存储在模板派生类中。下面的代码是一个小示例,但您可以假设将有数百个这样的stat编辑对象条目:
void Editor::statEditObjectTemplate(ObjectTemplate& r)
{
std::vector<iWindowEntry> temp;
iWindow iw(17, 60, temp);
std::vector<StatEditObjWrap> stats;
{ StatEditObjWrap stat(new StatEditObj_INT<unsigned short>(&r.glyph, iw, *this)); stats.push_back(stat); }
{ StatEditObjWrap stat(new StatEditObj_INT<unsigned int>(&r.mappedFcolour, iw, *this)); stats.push_back(stat); }
{ StatEditObjWrap stat(new StatEditObj_INT<unsigned int>(&r.mappedBcolour, iw, *this)); stats.push_back(stat); }
statEditor(stats, iw);
}有没有一种方法可以让模板typename
new StatEditObj_INT<type>(&r.variable, iw, *this)自动通过?
(注意: type用于StatEditObj_INT的构造函数的第一个参数)
发布于 2010-10-22 05:54:47
可以,您可以使用工厂函数:
// Note: Callee takes ownership of returned pointer
// (Alternatively, you should consider using a smart pointer like shared_ptr)
template <typename T>
StatEditObj_INT<T>* MakeNew_StatEditObj_INT(T* p, iWindow& rIW, Editor& rE)
{
return new StatEditObj_INT<T>(p, rIW, rE);
}然后你就有了:
stats.push_back(MakeNew_StatEditObj_INT(&r.glyph, iw, *this));
stats.push_back(MakeNew_StatEditObj_INT(&r.mappedFcolour, iw, *this));
stats.push_back(MakeNew_StatEditObj_INT(&r.mappedBcolour, iw, *this));这之所以有效,是因为当您使用函数模板时,编译器可以从函数参数中推导出模板参数(显然,在某些情况下,编译器不能从函数参数中推导出模板参数,例如,如果有一个模板参数没有在函数参数列表中表示,或者只在非推导上下文中表示)。在处理类模板时,这是一个常见的习惯用法。
发布于 2010-10-22 05:57:32
在非模板类中使用模板成员函数。
struct StatEditObjWrap
{
template <typename T>
static StatEditObjWrap create(T* p, iWindow& rIW, Editor& rE);
//...
}
template <typename T>
StatEditObjWrap StatEditObjWrap::create<T>(T* p, iWindow& rIW, Editor& rE) {
return StatEditObjWrap( new StatEditObj_INT<T>( p, rIW, rE ) );
}
{
vector<StatEditObjWrap> stats;
stats.push_back(StatEditObjWrap::create(&r.glyph, iW, *this));
}https://stackoverflow.com/questions/3992246
复制相似问题