Поскольку вам нужно хранить только члены одного класса с одинаковыми аргументами и типами возвращаемых данных, вы можете использовать функции указателя на член:
bool foo::call(char const * name) const {
static std::map<std::string, bool (foo::*)() const> table
{
{"one", &foo::one},
{"two", &foo::two}
};
auto entry = table.find(name);
if (entry != table.end()) {
return (this->*(entry->second))();
} else {
return false;
}
}
, использующий новый синтаксис инициализации:C ++ 11.Если ваш компилятор не поддерживает его, есть другие варианты.Вы можете инициализировать карту с помощью статической функции:
typedef std::map<std::string, bool (foo::*)() const> table_type;
static table_type table = make_table();
static table_type make_table() {
table_type table;
table["one"] = &foo::one;
table["two"] = &foo::two;
return table;
}
, или вы можете использовать Boost.Assignment :
static std::map<std::string, bool (foo::*)() const> table =
boost::assign::map_list_of
("one", &foo::one)
("two", &foo::two);
, или вы можете использовать массив, инайдите запись с помощью std::find_if
(или простого цикла for
, если в вашей библиотеке его еще нет), или std::binary_search
, если вы убедитесь, что массив отсортирован.