以下代码是我用于事件分派的简化版本。关键点是 有一个static_cast< T *>关于模板仿函数和另一个类的参数 确保传递给仿函数的参数是static_cast强制转换的参数。
struct AbstractArg {
virtual ~AbstractArg() { }
};
struct AbstractFunctor {
virtual void operator()(AbstractArg*) const = 0;
virtual ~AbstractFunctor() { }
};
namespace evil {
template<typename ArgT>
struct CastingFunctor : AbstractFunctor {
void operator()(AbstractArg* aarg) const
{
ArgT* arg = static_cast<ArgT*>(arg); // Danger!
// ... do stuff with it
}
};
} // namespace evil
class TypeidManager
{
public:
typedef std::map<std::string, AbstractFunctor*> map_type;
void dispatch(AbstractArg* arg) const
{
map_type::const_iterator it = typeid_map.find(std::string(typeid(*arg).name()));
if (it != typeid_map.end())
{
AbstractFunctor* pFunctor = it->second;
(*pFunctor)(arg);
}
};
template<typename ArgT>
void register_func( void (*fun_ptr)(ArgT*))
{
typeid_map.insert(std::make_pair(std::string(typeid(ArgT).name()),
new evil::CastingFunctor<ArgT>));
}
private:
map_type typeid_map;
};
这个模式有名称吗?
谢谢!
答案 0 :(得分:3)
这不是反模式,它是一种非常有用的技术,常用于类型擦除。
答案 1 :(得分:1)
我认为这是反模式,而不是模式。通常,您希望通过typeid_map构造提供给仿函数的东西来自公共继承层次结构,您可以使用动态多态(=虚方法)。基本上你已经重新发明了虚方法表查找(以非常低效的方式)。
答案 2 :(得分:0)
虽然我们在这里使用类似的东西,但并不是我所知道的。