0

BOOST_EXTENSION_TYPE_MAP_FUNCTIONBoost::Extensionマクロの使い方を見てみましょう。

たとえば、次のようにします

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」のようなものに拡張する方法を知りたいですか?

4

1 に答える 1

4

私のコメントを答えに入れさせてください...

マクロとは、そのマクロとして定義されたシンボルをその場所で置換するコンパイラーへの命令です (ここでは総称を使用します)。たとえば、

#define FOO 1

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

(ps 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;
}

ユーザーがその関数の独自の実装を定義できるようにするだけです...おそらく別の場所で-その関数のアドレスを取得し、ポインターを介して使用します...

于 2011-08-08T15:39:16.913 に答える