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

时间:2015-11-18 07:25:34

标签: c++ templates pointers delegates member

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

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 */
}

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

感谢。

2 个答案:

答案 0 :(得分:3)

在名为boo的上下文中,是一个从属名称。你需要使用

test.template boo<memfn>();

当然,当memfn是运行时值时,这将不起作用:它只能在持续进行时才能工作。如果你需要处理运行时值,你需要以某种方式传递参数。它可能成为lol2的成员或boo()的其他参数。

您还需要修正lol2的定义,并在T时使用DerivedType。{/ p>

答案 1 :(得分:0)

请记住,要成为可调用的成员函数必须与对象绑定。 因此,你会以某种方式在调用点传递类的对象。此外,您必须转发成员函数指针:

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