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_1
可能重複的[可變參數
限定的實施相關的功能
此之後宏觀把戲](http:// stacko verflow.com/questions/5365440/variadic-macro-trick) – PlasmaHH 2013-02-19 15:11:32
這裏的東西,可以使用的:http://stackoverflow.com/questions/2308243/macro-returning-the-number-of-arguments-it-is -given-in-c – StoryTeller 2013-02-19 15:13:51
@PlasmaHH,我認爲這個話題在第二個問題得到解答之前是無法關閉的。不過,感謝您的幫助。一個下去,一個去:) – maverik 2013-02-19 15:17:34