如何将成员函数指针转发到模板类型参数中。我有以下代码。
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 */
}
我需要能够将成员函数指针转发到模板参数中。我怎样才能做到这一点?
感谢。
答案 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)...);
}