Вставьте метод класса в значение карты и используйте шаблон - PullRequest
0 голосов
/ 21 июня 2011

Предположим, у меня есть следующее:

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);
}

В примере выше, в ключе карты мы передаем строку, а в значении карты указатель на метод класса X. Вставить в эту картуНапример, я использую:

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

Используя это, я могу вставлять методы, только если они имеют тип METHOD_NAME (значение с плавающей запятой *)

ОднакоЯ хочу вставить в карту методы типа __METHOD_NAME__(int *value), например (см. Здесь «int» вместо «float»).

Я полагаю, что для этого мне нужен шаблон.Но как?Есть ли способ решить эту проблему?

1 Ответ

1 голос
/ 21 июня 2011

В 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));
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...