如何使用升压预处理器运行一系列功能?

用户名

例如,我具有相同的两个参数类型的函数f1,f2等序列。我想使用宏

RUN((f1)(f2)(f3), a, b)

用结果运行功能序列

f1(a, b), f2(a, b), f3(a, b)

我认为Boost预处理程序可以提供帮助。我试过了

#define RUN_DETAIL(pR, pData, pF) pF(a, b);
#define RUN(pFs, a, b) BOOST_PP_SEQ_FOR_EACH(RUN_DETAIL, BOOST_PP_EMPTY, pFs)

但是失败了。怎么做?

找到如下答案

#define RUN_DETAIL(pR, pData, pF) pF pData;
#define RUN(pFs, ...) BOOST_PP_SEQ_FOR_EACH(RUN_DETAIL, (__VA_ARGS__), pFs)

该技术还适用于调用宏序列。

看到

您无需在此处使用宏。看到它住在Coliru

#include <boost/fusion/adapted/std_tuple.hpp>
#include <boost/fusion/algorithm.hpp>
#include <boost/phoenix.hpp>

template <typename... F>
struct sequence_application
{
    explicit sequence_application(F... fs) : fs(fs...) { }

    template <typename... Args>
        void operator()(Args const&... args) const {
            namespace phx = boost::phoenix;
            using namespace phx::arg_names;

            boost::fusion::for_each(fs, phx::bind(arg1, phx::cref(args)...));
        }
    private:
        std::tuple<F...> fs;
};

template <typename... F>
sequence_application<F...> apply_all(F&&... fs) {
    return sequence_application<F...>(std::forward<F>(fs)...);
}

让我们演示一下:

#include <iostream>
#include <string>

void foo(const char* v) { std::cout << __FUNCTION__ << ": " << v << "\n"; }
void bar(std::string v) { std::cout << __FUNCTION__ << ": " << v << "\n"; }

struct poly_functor {
    template <typename... T>
        void operator()(T&...) const { std::cout << __PRETTY_FUNCTION__ << "\n"; }
};

您当然可以按照问题进行直接调用:

poly_functor pf;
apply_all(&foo, &bar, pf)("fixed invocation is boring");

但是,那确实很无聊。怎么样,我们保持复合函子周围,并通过到另外的算法?

auto combined = apply_all(&foo, &bar, pf);

boost::for_each(
        std::vector<const char*> {"hello", "world", "from", "various"},
        combined);

现在,尝试使用宏方法。不是C ++中的一等语言公民。

最后,让我们展示一下它可以与变量参数列表一起使用:

struct /*anonymous*/ { int x, y; } point;

// the variadic case
apply_all(pf)("bye", 3.14, point);

完整的演示打印:

foo: fixed invocation is boring
bar: fixed invocation is boring
void poly_functor::operator()(T &...) const [T = <char const[27]>]
foo: hello
bar: hello
void poly_functor::operator()(T &...) const [T = <const char *const>]
foo: world
bar: world
void poly_functor::operator()(T &...) const [T = <const char *const>]
foo: from
bar: from
void poly_functor::operator()(T &...) const [T = <const char *const>]
foo: various
bar: various
void poly_functor::operator()(T &...) const [T = <const char *const>]
void poly_functor::operator()(T &...) const [T = <char const[4], const double, const <anonymous struct at test.cpp:54:5>>]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Spark处理一系列HBase行?

来自分类Dev

如何在Django中迭代一系列功能?

来自分类Dev

如何顺序处理一系列AJAX请求的结果?

来自分类Dev

如何处理一系列配对文件

来自分类Dev

预处理器 IDE 是唯一的功能吗?

来自分类Dev

无法使用SSH运行一系列命令

来自分类Dev

使用C11预处理器封装功能

来自分类Dev

如何通过Inno Setup在预处理器函数中使用预处理器变量

来自分类Dev

如何仅在本地标头上运行预处理器?

来自分类Dev

NSOperation管理一系列功能

来自分类Dev

使用Pixate Freestyle iOS运行预处理器

来自分类Dev

运行一系列测试功能以在浏览器堆栈中显示为单独的测试

来自分类Dev

如何使用boost预处理器生成访问器?

来自分类Dev

如何使用boost预处理器生成访问器?

来自分类Dev

如何使用rxJava实现一系列连续操作?

来自分类Dev

如何使用噪音制作一系列彩色矩形?

来自分类Dev

如何使用一系列ID的CSS设置表格

来自分类Dev

如何使用Bash遍历一系列文件

来自分类Dev

如何使用“安全随机”搜索一系列数字?

来自分类Dev

如何使用for循环构建一系列承诺的响应?

来自分类Dev

如何在运行时在Node.js中执行一系列图像处理步骤

来自分类Dev

如何使用另一个定义使 if/else 预处理器宏无效?

来自分类Dev

如何使用预处理器计算日志

来自分类Dev

如何使用Clang作为预处理器

来自分类Dev

如何使用html2js预处理器?

来自分类Dev

如何遍历一系列结构

来自分类Dev

如何制作一系列句子?

来自分类Dev

如何打印一系列纸张?

来自分类Dev

如何测试一系列互动?