使用看似标准的w
,x
,y
,z
演示,假设我有以下宏尝试转换为“可迭代”预处理器宏
#define INSTANTIATE_FUNC(rtype, func_name, ...) \
template rtype func_name< w > (__VA_ARGS__); \
template rtype func_name< x > (__VA_ARGS__); \
template rtype func_name< y > (__VA_ARGS__); \
template rtype func_name< z > (__VA_ARGS__);
为了完整性,假设我们试图实例化以下
struct w { static constexpr int data = 0; };
struct x { static constexpr int data = 1; };
struct y { static constexpr int data = 2; };
struct z { static constexpr int data = 3; };
template <class Data>
void printData(const std::string &prefix) {
std::cout << prefix << Data::data << std::endl;
}
INSTANTIATE_FUNC(void, printData, const std::string &prefix)
我为方便起见minimal gist with a build system,所以如果您有兴趣尝试,则无需重新创建所有内容:)
我无法弄清楚如何处理这个问题。唯一的功能性(但没有用)刺伤
#include <boost/preprocessor/list/for_each.hpp>
#define LIST (w, (x, (y, (z, BOOST_PP_NIL))))
#define MACRO(r, data, elem) template void data < elem > (const std::string &prefix);
#define INSTANTIATE_FUNC(rtype, func_name, ...) \
BOOST_PP_LIST_FOR_EACH(MACRO, func_name, LIST)
这是有效的,但显然不够。
为什么 也不能用于序列?
#include <boost/preprocessor/seq/for_each.hpp>
// this does work, my code included the wrong header
// on what I was testing with (seq/for_each_i.hpp)
#define SEQ (x)(y)(z)(w)
#define INSTANTIATE_FUNC(rtype, func_name, ...) \
BOOST_PP_SEQ_FOR_EACH(MACRO, func_name, SEQ)
我应该如何构建template rtype func_name < {w,x,y,z} > {args,in,__VA_ARGS__}
?我尝试了很多不同的东西,但问题似乎是无法解决只提取w
然后循环遍历__VA_ARGS__
,然后继续。我一直在努力让BOOST_PP_LIST_FOR_EACH_R
工作。这至少是正确的看法吗?
作为完整性检查,您无法在宏中定义宏吗?
的精神#define INSTANTIATE_FUNC(rtype, func_name, ...) \
#define MACRO_##func_name(r, data, elem) data < elem > (__VA_ARGS__); \
BOOST_PP_LIST_FOR_EACH(MACRO_##func_name, func_name, LIST)
我最终致力于实现LIST
/ SEQ
的可选扩展(SEQ
看似更多更容易实现此目的)的目标意味着什么。感谢您的任何建议/资源。
答案 0 :(得分:1)
您的问题似乎是,您需要向MACRO
BOOST_PP_(LIST|SEQ)_FOR_EACH
中的MACRO
投放多个数据,并且只有一个&#34;插槽&#34;你可以使用。您似乎缺少的事实是,您可以将这些部分分组,例如,元组,然后使用BOOST_PP_TUPLE_ELEM
访问//These are not required, just to help with readability
#define MACRO_GET_RETURN_TYPE(TUPLE) BOOST_PP_TUPLE_ELEM(3,0,TUPLE)
#define MACRO_GET_FUNC_NAME(TUPLE) BOOST_PP_TUPLE_ELEM(3,1,TUPLE)
#define MACRO_GET_ARGS_SEQ(TUPLE) BOOST_PP_TUPLE_ELEM(3,2,TUPLE)
#define MACRO(_, DATA, ELEM) template MACRO_GET_RETURN_TYPE(DATA) MACRO_GET_FUNC_NAME(DATA) < ELEM > (BOOST_PP_SEQ_ENUM(MACRO_GET_ARGS_SEQ(DATA)));
// with boost seq
#define SEQ (x)(y)(z)(w)
#define INSTANTIATE_FUNC(rtype, func_name, ...) \
BOOST_PP_SEQ_FOR_EACH(MACRO, (rtype,func_name,BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)), SEQ)
内的不同元素。这样的事情可以奏效:
UPGRADINGPRODUCTCODE
PS:不,你不能在宏中定义一个宏,你在这里发布的代码适用于序列,你的要点中的代码不会因为使用错误的标题。