将指向成员函数参数的指针传递给模板参数

Passing pointer to member function parameter into template argument

如何将成员函数指针转发到模板类型参数中。我有以下代码。

template <typename T, typename ret, typename ...params>
class lol2
{
    template <ret(T::*memfn)(params...)>
    void boo() 
    {
        /* some code here */ 
    }
};

template<typename T, typename ret, typename ... params>
void foo(ret(T::*memfn)(params...))
{
    auto test = lol2<T, ret, params...>{};
    test.boo<memfn>(); /*error: expected primary-expression before ‘)’ token */
}

我需要能够将成员函数指针转发到模板参数中。我怎样才能做到这一点?

谢谢。

在它被调用的上下文中 boo 是从属名称。您需要使用

test.template boo<memfn>();

当然,当 memfn 是一个 运行 时间值时,这是行不通的:只有当它是一个恒定的 experession 时,它才能工作。如果您需要处理 运行-time 值,则需要以某种方式传递参数。它可以成为 lol2 的成员或 boo().

的附加参数

您还需要修复 lol2 的定义并使用 T insted if DerivedType.

请记住,成员函数必须与对象绑定才能调用。 因此,您将不得不以某种方式在调用点传递 class 的对象。此外,你必须转发成员函数指针:

template <typename T, typename ret, typename ...params>
class lol2 {
  T &obj;
public:
  lol2(T &obj_) : obj(obj_) {}
  void boo(ret(T::*memfn)(params...), params&&... pars) { 
    (obj.*memfn)(std::forward<params>(pars)...);
  }
};

template<typename T, typename ret, typename ... params>
void foo(T &obj, ret(T::*memfn)(params...), params&&... pars) {
  auto test = lol2<T, ret, params...>(obj);
  test.boo(memfn, std::forward<params>(pars)...);  
}

LIVE DEMO