用函数/模板替换宏

use*_*182 5 c++ macros

我想用函数/模板替换宏:

#define FOO( f ) \
    int result = m_Member.f; \
    switch ( result ) \
    { \
    case 1: \
        m_pMember1->f; \
        break;
    case 2:
        m_pMember2->f; \
        break;
    }

class foo
{
public:
    void foo1(int x, int y)
    {
        FOO( foo1(x, y) )
    }
    void foo2(int x, double y, void *z)
    {
        FOO( foo2(x, y) )
    }
protected:
    fooA m_Member;
    fooB m_Member1;
    fooC m_Member2;
};
Run Code Online (Sandbox Code Playgroud)

所以我的问题是函数名称与参数一起传递给宏。我可以重写对 FOO( foo1, x, y ) 之类的调用,然后处理变量参数列表。所以宏将只定义一个函数调用。但也许有更优雅的解决方案。

Mat*_* M. 3

事实上,这是不可能的。

问题在于模板本质上是类型安全的。然而,你的例子却不是。该名称没有任何固有的东西foo2来限制它可以应用的类型集!

为了说明这个问题,考虑一个典型的成员函数:

struct Foo { int doit(double x, double y); };
Run Code Online (Sandbox Code Playgroud)

它的类型是int (Foo::*)(double,double).

请注意方法所属类的名称如何出现在类型本身中。

因此,您不能调用doit两个不相关的类......所以我担心您会得到一些重复:

class foo {
public:
    void foo1(int x, int y)
    {
        dispatch(&fooA::foo1, &fooB::foo1, &fooC::foo1, x, y);
    }

    void foo2(int x, double y, void *z)
    {
        dispatch(&fooA::foo2, &fooB::foo2, &fooC::foo2, x, y, z);
    }

private:
    template <typename... Args>
    void dispatch(int (fooA::* f)(Args...),
                  void (fooB::* g)(Args...),
                  void (fooC::*h)(Args...),
                  Args... args)
    {
        switch((m_Member.*f)(args...)) {
        case 1: (m_Member1.*g)(args...); return;
        case 2: (m_Member2.*h)(args...); return;
        }
    }

    fooA m_Member;
    fooB m_Member1;
    fooC m_Member2;
};
Run Code Online (Sandbox Code Playgroud)

是的,它有效