如何通过成员函数作为参数?

时间:2018-07-09 12:03:38

标签: c++ templates

C ++语法使我丧命。 我正在尝试将this +指针传递给成员函数: 所以我做了以下事情:

template <void(Myclass::*func)()>
static void Myfunction(Myclass* theThis)
{
    theThis->*func();
}

这很好用。

但是现在我想从该函数传递给该成员函数的另一个函数。

template <void(Myclass::*func)()>
static void Myfunction2(Myclass* theThis) // My new function
{
    theThis->*func();
}

template <void(Myclass::*func)()>
static void Myfunction(Myclass* theThis)
{
    Myfunction2<&(Myclass::*func)>(theThis)  // This doesn't compile, the template parameter is probably incorrect
}

但是它不能编译,我不确定如何传递此成员函数。

我得到:error C2059: syntax error: '<tag>::*'

编辑:

只是要弄清楚。 我没有一个名为func的函数,这只是指向成员函数的指针的名称

2 个答案:

答案 0 :(得分:5)

func已经是您要传递的值,所以只需传递它即可:

template <void(Myclass::*func)()>
static void Myfunction2(Myclass* theThis) // My new function
{
    (theThis->*func)();
}

template <void(Myclass::*func)()>
static void Myfunction(Myclass* theThis)
{
    Myfunction2<func>(theThis);
}

答案 1 :(得分:4)

我建议您根本不要将指针指向成员的函数用作模板参数。而是使用简单得多的类型,并将该类型的可调用对象作为参数传递。

这将允许您使用std::bind绑定到函数,或者使用lambda expressions甚至是普通的非成员函数。

也许是这样的:

template<typename C>
void MyFunction2(C callable)
{
    callable();
}

template<typename C>
void MyFunction1(C callable)
{
    MyFunction2(callable);
}

使用方式类似

MyFunction1(std::bind(&MyClass::TheRealFunction, theThis));

MyFunction1([&theThis]()
{
    theThis->TheRealFunction();
});

使用这样的模板是所有标准库函数以可调用对象作为参数的常用方法。


您当然可以使用std::function,然后完全不使用模板:

void MyFunction2(std::function<void()> callable)
{
    callable();
}

void MyFunction1(std::function<void()> callable)
{
    MyFunction2(callable);
}

用法如上所述。