0

この関数を繰り返して数回呼び出そうとしています。

template<class T>
void METADATA_METHODS_IMPL(std::string& metadata, const T &value, const std::string &key)
{
    metadata += boost::format("%1%:%2%") % key % value();
}

以下のマクロを書きました。

#define METADATA_METHODS_IMPL_1(md, v1)\
   METADATA_METHODS_IMPL(md, v1, #v1);

#define METADATA_METHODS_IMPL_2(md, v1, v2)\
   METADATA_METHODS_IMPL_1(md, v1)\
   METADATA_METHODS_IMPL_1(md, v2)

#define METADATA_METHODS_IMPL_3(md, v1, v2, v3)\
   METADATA_METHODS_IMPL_2(md, v1, v2)\
   METADATA_METHODS_IMPL_1(md, v3)

等々 ...

引数の数がMETADATA_METHODS_IMPL_Nどこにあるかを呼び出す必要がありますN__VA_ARGS__

#define METADATA_METHODS(...)\
std::string METADATA_METHODS_IMPL_FUNC()\
{\
    std::string metadata;\
    BOOST_PP_OVERLOAD(METADATA_METHODS_IMPL_,__VA_ARGS__)(metadata, __VA_ARGS__)\
    return metadata;\
}

上記のコード (を使用BOOST_PP_OVERLOAD) では、不適切な結果が得られます。

class X
{
    std::string F1();
    std::string F2();
    std::string F3();

    METADATA_METHODS(F1, F2, F3);
};

これにより、

std::string METADATA_METHODS_IMPL_FUNC() 
{
    std::string metadata; 
    METADATA_METHODS_IMPL(metadata, F1, F2, F3, "F1", "F2", "F3"); 
    METADATA_METHODS_IMPL(metadata, , ""); 
    METADATA_METHODS_IMPL(metadata, , ""); 
    return metadata; 
};

そして、私はこのようなものが欲しい:

std::string METADATA_METHODS_IMPL_FUNC() 
{
    std::string metadata; 
    METADATA_METHODS_IMPL(metadata, F1, "F1"); 
    METADATA_METHODS_IMPL(metadata, F2, "F2"); 
    METADATA_METHODS_IMPL(metadata, F3, "F3"); 
    return metadata; 
};
  • 望ましい結果を達成する方法を知っている人はいますか?
  • ライブラリを使用して、一部を使用Boost.preprocessorして自動的に生成できますかMETADATA_METHODS_IMPL_KK in [1 .. 10]METADATA_METHODS_IMPL_1
4

1 に答える 1