以下代码是我用于事件分派(dispatch)的简化版本。重点是
在模板函子和另一个类的参数上有一个static_cast
确保传递给函子的参数是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;
};

这个模式有名称吗?

谢谢!

最佳答案

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

关于c++ - 有没有一种模式可以管理邪恶的static_casts,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1059024/

10-13 07:05