是否有一个模式管理邪恶的static_casts

时间:2009-06-29 15:47:16

标签: c++ design-patterns

以下代码是我用于事件分派的简化版本。关键点是 有一个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;
};

这个模式有名称吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

这不是反模式,它是一种非常有用的技术,常用于类型擦除。

答案 1 :(得分:1)

我认为这是反模式,而不是模式。通常,您希望通过typeid_map构造提供给仿函数的东西来自公共继承层次结构,您可以使用动态多态(=虚方法)。基本上你已经重新发明了虚方法表查找(以非常低效的方式)。

答案 2 :(得分:0)

虽然我们在这里使用类似的东西,但并不是我所知道的。