在地图值中插入一个类方法并使用模板

时间:2011-06-21 00:18:21

标签: c++ templates methods map

假设我有以下内容:

class X
{
  private:
    typedef int (X::*xMethod) (float*);

    typedef std::map<std::string, xMethod> callback_t;

    callback_t m_callback;

  public:

    getPower(float *value);
    getTemperature(float *value);
}

在上面的例子中,在map键中我们传递一个字符串,在map值中是一个指向类X方法的指针。例如,要在这个地图中插入,我正在使用:

m_callback.insert(std::pair<std::string, xMethod>("voltage", &X::getPower));

使用此功能,我只能插入 METHOD_NAME 类型的方法(浮点数*)

但是,我想插入类型__METHOD_NAME__(int *value)的map方法(例如,参见'int'而不是'float')。

我想要做到这一点,我需要一个模板。但是怎么样?有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

C ++ 98中没有模板typedef,但您可以将通用性包装到辅助结构中。示例代码并排显示您自己的版本和我的通用版本。

#include <map>
#include <string>

class Foo
{
  typedef int (Foo::*xMethod)(float*);
  typedef std::map<std::string, xMethod> cb_map;

  template <typename T> struct CBHelper
  {
    typedef int (Foo::*fptype)(T*);
    typedef std::map<std::string, fptype> type;
  };

  cb_map m_cb_float;
  CBHelper<int>::type m_cb_int;

public:
  int getF(float *);
  int getI(int *);
  Foo()
  {
    m_cb_float.insert(cb_map::value_type("Hello", &Foo::getF));
    m_cb_int.insert(std::make_pair("Hello", &Foo::getI));
  }
};