1

名前空間内で定義された一連の定数があるとします。

namespace FooConstants{
    const string foo1 = "foo1";
    const string foo2 = "foo2";
    //...
    const string fooN = "fooN";
}

Boost を使用してこれらの定数名を「反復」することは可能ですか? 生成するを展開しfoo1、それぞれで何かをさせてくれるマクロのようなもの。これは Boost ライブラリを使用して実行できると思いますが、見つかりませんでした。foo2fooN

ところで、この種の技に適切な名前はありますか?

編集:これがコンパイル時または実行時に解決されることを意図しているかどうかを明確にするように求められました。答えはコンパイル時間です。すべての定数を処理するコードを生成したいと考えています。

4

3 に答える 3

4

これは、 Boostプリプロセッサライブラリを使用して実現できます。

BOOST_PP_SEQ_FOR_EACHが最も関連性が高いようです。

于 2013-03-08T21:06:27.603 に答える
2

コンマの生成を簡素化するために、定数の番号付けを 0 から開始するように例を変更しましたが、コンパイル時に発生することで、これを確実に実行できます。

#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/iteration/local.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <utility>
#include <string>
#include <map>

namespace FooConstants{
    const std::string foo0 = "foo0";
    const std::string foo1 = "foo1";
    const std::string foo2 = "foo2";
    const std::string foo3 = "fooN";
#define N 3
}

namespace metadata {

const std::map<int, std::string> constants = {

#define BOOST_PP_LOCAL_MACRO(n) \
   BOOST_PP_COMMA_IF(n) \
   std::make_pair(n, BOOST_PP_CAT(FooConstants::foo,n))

#define BOOST_PP_LOCAL_LIMITS (0, N)

#include BOOST_PP_LOCAL_ITERATE()
 };
}

int main() {}

ここで、プリプロセッサは を初期化できる initalizer_list を生成しconst std::mapます。ただし、必要に応じて、constexpr とテンプレートを使用して、よりクレイジーな const を実行できます。

可能だからといって、実際のコード ベースで実行することをお勧めするわけではありません。

于 2013-03-08T21:47:23.993 に答える
0

これには、c++ にはないメタデータが必要です。いくつかのカスタム マクロを考え出し、foomax や foomin などの規則を使用することはできますが、私が知っているライブラリはありません。

于 2013-03-08T21:04:11.067 に答える