C++实现类似于动态语言中的函数定义的宏

编译需要开启C++14支持

// fun.h

#include<boost/preprocessor.hpp>

#define SIZE(...) BOOST_PP_TUPLE_SIZE((__VA_ARGS__))

#define _CAT(a, b) a##b
#define CAT(a, b) _CAT(a, b)

#define _STRING(a) #a
#define STRING(a) _STRING(a)

#define OP_HEAD(d, state, x) \
    (BOOST_PP_SUB(BOOST_PP_TUPLE_ELEM(2, 0, state), 1), \
     BOOST_PP_LIST_CONS(typename CAT(_, BOOST_PP_TUPLE_ELEM(2, 0, state)), BOOST_PP_TUPLE_ELEM(2, 1, state)))

#define OP_BODY(d, state, x) \
    (BOOST_PP_SUB(BOOST_PP_TUPLE_ELEM(2, 0, state), 1), \
     BOOST_PP_LIST_CONS(CAT(_, BOOST_PP_TUPLE_ELEM(2, 0, state)) x, BOOST_PP_TUPLE_ELEM(2, 1, state)))

#define FUN_HEAD(...) \
    template<BOOST_PP_REMOVE_PARENS( \
        BOOST_PP_LIST_TO_TUPLE( \
            BOOST_PP_TUPLE_ELEM(2, 1, \
                BOOST_PP_LIST_FOLD_RIGHT(OP_HEAD, (SIZE(__VA_ARGS__), BOOST_PP_LIST_NIL), \
                    BOOST_PP_TUPLE_TO_LIST((__VA_ARGS__))))))>

#define FUN_BODY(...) \
    BOOST_PP_LIST_TO_TUPLE( \
        BOOST_PP_TUPLE_ELEM(2, 1, \
            BOOST_PP_LIST_FOLD_RIGHT(OP_BODY, (SIZE(__VA_ARGS__), BOOST_PP_LIST_NIL), \
                BOOST_PP_TUPLE_TO_LIST((__VA_ARGS__)))))

#define FUN(f, ...) \
    FUN_HEAD(__VA_ARGS__) auto f FUN_BODY(__VA_ARGS__)

测试

#include <iostream>
#include "fun.h"

namespace test {

FUN(plus, a, b) {
    return a + b;
}

FUN(push, &a, b) {
    a.push_back(b);
}

}

int main(int argc, char **argv) {
    // test plus
    std::cout << test::plus(1, 2) << std::endl;
    // test push
    std::vector<int> v {1, 2, 3};
    test::push(v, 4);
    for (auto & i : v) std::cout << i << ' ';
    std::cout << std::endl;
    return 0;
}

结果

3
1 2 3 4
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,870评论 25 708
  • 值得学习的C语言开源项目 WebbenchWebbench是一个在linux下使用的非常简单的网站压测工具。它使用...
    码脑阅读 5,113评论 6 88
  • 今天跟一个产品商朋友吃了个饭,西安这边的市场还是没有特别搞清楚,压力有,下一步还是一步一个脚印多多梳理吧
    祎铭阅读 166评论 0 0
  • 太阳照常升起,一缕阳光拂过艾小曼微笑的脸、嘴角。 “小枫,起床了吗?”艾小曼发了一条简讯。 “起了,你吃早饭没?”...
    lzbvae阅读 548评论 0 1
  • 《驴得水》相信大家都有所耳闻或者观看过。在一个深夜里,一个捧着手机看得哈哈大笑的人是我;在同样的一个深夜里,捧着手...
    婉青婉青阅读 507评论 6 7