Макрос, получающий информацию из окружающего контекста - PullRequest
0 голосов
/ 11 июля 2011

Я знаю, что, возможно, это немного сложно, но мне было интересно, есть ли способ сделать это красиво:

У меня есть карта функций:
std::map<std::string, std::function<int(int)> > fnmap;

И несколько функций, которые я хотел бы добавить к этой карте.

Есть ли способ украсить функции, чтобы я мог просто иметь:

MAPNAME("FN") int fn(int param) {}

MAPNAME("FN2") int fn2(int param2) {} ..

, что должно привести к fnmap["FN"] = &fn;

Как я уже говорил выше, это немного натянуто, но я подумал, стоит спросить!

1 Ответ

0 голосов
/ 11 июля 2011
struct Remember {
    static std::map<std::string, std::function<int(int)> > map;
    Remember (int (*f) (int), const char * name) {
        map [name] = f;
    }
};

// Needs anonymous namespace to be able to include it more than once in a header.
#define MAPNAME(x) namespace {Remember _##__LINE__ (x, #x);}

int f1 (int);
int f2 (int);
MAPNAME (f1)
MAPNAME (f2)

Функции должны быть объявлены до того, как вы вызовете MAPNAME, так что это на самом деле не считается украшением.

Макросы не понимают синтаксис C, поэтому они не могут использовать ни один «контекст», который вы им не дали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...