【发布时间】:2013-02-19 15:02:55
【问题描述】:
我试图以重复的方式多次调用此函数。
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库为某些K in [1 .. 10]使用METADATA_METHODS_IMPL_1自动生成METADATA_METHODS_IMPL_K
【问题讨论】:
-
Variadic macro trick的可能重复
-
这里有一些可以使用的东西:stackoverflow.com/questions/2308243/…
-
@PlasmaHH,我认为在回答第二个问题之前无法关闭该主题。不过,感谢您的帮助。一个下来,一个去:)
-
@maverik:这就是为什么在 SO 上将多个问题作为一个问题发布是不好的原因:我相信很多人也会忽略第二个问题。请记住,SO 也会保留问题供其他人查找;我建议您只需为第二个问题打开一个新问题,并在那里进行更详细的解释。
-
@PlasmaHH,你是对的。无论如何,我正在检查您建议的主题的答案。第二个对我不起作用(在 VS 2008 中)。
标签: c++ macros variadic-macros