当我尝试为这样的事情实现工厂模式时,我一遍又一遍地遇到同样的难题:
class Base {
template <typename T>
void doSomethingWithMember(T){
}
void doing(){
doSomethingWithMember(this->a);
}
private:
int a;
};
class A: public Base {
double a;
};
class B: public Base{
float a;
};
struct Dictionary {
typedef Base* (*FunctionPointer)(void);
std::map <int, FunctionPointer> fmap;
template <typename Target>
static Base* construct() {
return new Target();
}
Dictionary() {
fmap.insert(std::make_pair(0, &Dictionary::construct<A>));
fmap.insert(std::make_pair(1, &Dictionary::construct<B>));
}
Base* Call( int i ) const {
std::map<int, FunctionPointer>::const_iterator entry = fmap.find( i );
return entry == fmap.end() ? new Base() : (*entry->second)();
}
};
问题是,我无法定义a
,Base
因为在最好的情况下它会被隐藏。但是如果没有a
i 的定义,就无法为继承者实现一个函数来处理他们的a
. 我还尝试将其实现Base
为模板,这导致了我在通过字典创建对象时总是必须知道返回的数据类型(int、double、float)的问题——说我没有Base<int>
, Base<float>
,的基本对象类型Base<double>
。而且我确实需要字典来给我一个对象,根据i
我除了i
.