Как вьющиеся скобки работают в Boost :: extension, как сделать такие макросы самостоятельно? - PullRequest
0 голосов
/ 08 августа 2011

Я смотрю, как мы используем Boost :: Extension BOOST_EXTENSION_TYPE_MAP_FUNCTION макрос.

Например, например this :

BOOST_EXTENSION_TYPE_MAP_FUNCTION
{
    std::map<std::string, boost::extensions::factory<service> > &factories(types.get());
    factories["file_service"].set<file_service>();
}
Макрос

BOOST_EXTENSION_TYPE_MAP_FUNCTION определен в extension.hpp .

Интересно, как этот макрос понимает, что находится в фигурных скобках, и как, например, развернуть этот макрос во что-то, что выглядело бы как «Hello extended macro»?

1 Ответ

4 голосов
/ 08 августа 2011

Позвольте мне поставить свой комментарий в ответ ...

Макрос - это инструкция для компилятора (здесь я использую собирательный термин) для замены в этом месте символов, определенных как этот макрос, например

#define FOO 1

int val = FOO; // at this point, FOO is replaced with 1

(с. Пожалуйста, не делайте этого в C ++)

Теперь, что происходит в вашем случае, так это то, что существует набор символов (сигнатура функции), определенный как макрос, поэтому все, что происходит, это то, что компилятор заменит макрос на символы, и конечный результат будет выглядеть (примерно) так:

void boost_extension_exported_type_map_function(boost::extensions::type_map& types)
{
    std::map<std::string, boost::extensions::factory<service> > &factories(types.get());
    factories["file_service"].set<file_service>();
}

Что, как вы можете видеть, является простой функцией. Вы тоже можете это сделать (но не делайте этого, если у вас нет веских причин)

#define BOB void foo(std::string const& bar)

BOB
{
  std::cout << "HEllo: " << bar << std::endl;
}

Он просто позволяет пользователю определить свою собственную реализацию для этой функции ... предположительно где-то еще - он берет адрес этой функции и использует его через указатель ...

...