LINUX.ORG.RU

Мэпинг хэндлеров

 


0

1

Дано

std::map<string, aClass::*> handler_map = {{"say_horse_sound", &aClass::say_horse_sound},
{"say_dog_sound", &aClass::say_dog_sound}};

std::string key_word = "say_horse_sound";

MakeJob(handler_map.at(key_word));

Ну и не пару таких, а полсотни записей.

Можно как в C++ без простыни и макросов сделать вызов метода класса совпадающий с написанием ?

★★★★★

Последнее исправление: fornlr (всего исправлений: 2)

При набивке handler_map? Но кто то же должен ее набить…

Если можно в макросы, то можно без handler_map. В некоторых случаях. Наверное.

AntonI ★★★★★
()
Ответ на: комментарий от fornlr

Простыню можно сгенерить аутоматичесссски на каком нить питоне. И потом проинклюдить. Метапрограммирование же!

Ну или макросами что бы по два раза имя метода не писать.

А по другому… Я не знаю как, в плюсах нет толком интроспекции и рефлексии:-(

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 2)
Ответ на: комментарий от fornlr

Насчет автогенерации - я бы swig-ом сделал из этого питоний модуль, запустил питон, прочесал атрибуты класса и выбрал нужные.

Но скорей всего это можно сделать более прямо какими нить регулярками…

AntonI ★★★★★
()

c++ язык со статической проверкой типов. Накати петончик, если не нравится.

Но если нужно убрать дублирования для избежания опечаток, то можно через макросы закостылить. Будешь писать только один раз

https://godbolt.org/z/4TcqfYr18

#define DECL_SOUND(key) \
  std::make_pair(#key, &aClass::key)
  
using MemberPointer = void (aClass::*)();
std::map<std::string, MemberPointer> handler_map = {
    DECL_SOUND(say_horse_sound),
    DECL_SOUND(say_dog_sound)
};
ox55ff ★★★★★
()
Ответ на: комментарий от hateyoufeel

Можно скомпилять сошкой и вытащить указатель через dlsym.

fluorite ★★★★★
()

Можно … сделать вызов метода класса совпадающий с написанием ?

не нужно изобретать свой dbus )

anonymous2 ★★★★★
()

Можно одним препроцессором:

$ cat file.hpp
HIDE(
	class Qwerty
	{
	public:
)
		DECL(void, fn, ())
		DECL(void, fn2, ())
		DECL(void, fn3, ())
HIDE(
	};
)

Далее приинклуживаем в нужных местах file.hpp с нужными HIDE и DECL, условно:

static map &get() {
#define HIDE(...)
#define DECL(ret, name, args)  {#name, name}
    static map m{
#include "file.hpp"
    };
    return m;
#undef HIDE
#undef DECL
}
kvpfs ★★
()
Последнее исправление: kvpfs (всего исправлений: 2)

Непонятно что тебе вообще нужно. Создание мапы, вызов. Какая цель всего этого.

right_security
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.