在定义它的位置展开宏,而不是在它被调用的位置

时间:2014-02-17 20:29:05

标签: c++ macros

听起来很傻,这可能吗?

  struct Bar {
    void dummy() { }

    #define act(name, ...) dummy(); \
    // Do something inside Bar, not in main
  }

bar.act(push_back, 42);

我认为不是。但我试图以某种方式将可变参数宏定义为Bar的成员函数。常规版本如下:

template <typename Func, typename... Args>
auto act(Func func, Args&&... args) -> decltype(func(std::forward<Args>(args)...)) {
    return func(std::forward<Args>(args)...);
}

这需要两件事:我可以使用这个宏来定义所需的每个成员函数:

#define cmf(name) struct name \
{ \
    template <typename... Args> \
    auto operator()(Args&&... args) -> decltype(cont.name(std::forward<Args>(args)...)) { \
        return cont.name(std::forward<Args>(args)...); \
    } \
} name;
// ...
bar.push_back(42);

或者是不可行的演员:

bar.act(std::bind((void (std::vector<int>::*)
                  (const typename std::vector<int>::value_type& value))    
   &std::vector<int>::push_back, &bar.cont, std::placeholders::_1), 42);

我的目标是使用此可变参数宏为name参数调用cmf,然后使用__VA_ARGS__作为函数参数。

0 个答案:

没有答案