gpt4 book ai didi

c++ - 使用 boost 预处理器迭代调用可变参数模板

转载 作者:行者123 更新时间:2023-11-30 02:33:50 24 4
gpt4 key购买 nike

假设我有一个可变参数模板:

template<typename... Args>
class Foo;

这个可变参数模板递归地生成另一个模板,直到它到达最后一层的一个参数 Foo。现在我想要一个宏,例如 Bar(...),当我调用它时,我会得到这样的结果:

Bar(float, int, string, vector<int>)
// expands to
Macro(Foo<float, int, string, vector<int>>)
Macro(Foo<int, string, vector<int>>)
Macro(Foo<string, vector<int>>)
Macro(Foo<vector<int>>)

Macro(...) 是另一个用于在此类上执行某些操作的宏。我希望能够使用 Boost 预处理器来减少我必须编写的代码。

请给我一些提示,帮助我编写这样的宏。

最佳答案

我不知道这是否是解决您问题的最佳方法,但这可以满足您的需求:

#include <boost/preprocessor/repetition/repeat_from_to.hpp>
#include <boost/preprocessor/seq.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>

#define CALL_MACRO(_,__,SEQ) Macro(Foo<BOOST_PP_SEQ_ENUM(SEQ)>)

#define GENERATE_MACRO_INVOCATIONS(SEQS) BOOST_PP_SEQ_FOR_EACH(CALL_MACRO,_,SEQS)

#define GENERATE_DESCENDING_SEQUENCES(_,INDEX,DATA) (BOOST_PP_SEQ_REST_N(INDEX,DATA))

#define BAR_IMPL(SEQ) GENERATE_MACRO_INVOCATIONS(BOOST_PP_REPEAT_FROM_TO(0,BOOST_PP_SEQ_SIZE(SEQ),GENERATE_DESCENDING_SEQUENCES, SEQ))


#define Bar(...) BAR_IMPL(BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))

Bar(float, int, string, vector<int>)
  • 您最初有一个可变数据:float, int, string, vector<int> .
  • BOOST_PP_VARIADIC_TO_SEQ将其转换为:(float)(int)(string)(vector<int>)
  • BOOST_PP_REPEAT_FROM_TO调用宏 GENERATE_DESCENDING_SEQUENCES BOOST_PP_SEQ_SIZE(SEQ)时间序列作为数据和从 0 开始的索引。
  • BOOST_PP_SEQ_REST_N(INDEX,DATA)删除 INDEX来自 DATA 的第一个元素并返回其余部分。此结果放在一对括号内。
  • 在调用 REPEAT 之后,您有一系列序列:

    ((float)(int)(string)(vector))((int)(string)(vector))( (字符串)( vector ))(( vector ))

  • BOOST_PP_SEQ_FOR_EACH电话 CALL_MACRO序列序列中的每个元素。

  • 最后 BOOST_PP_SEQ_ENUM获取一个序列并返回其元素,以逗号分隔。

Preprocessed on Coliru

关于c++ - 使用 boost 预处理器迭代调用可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35031775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com