将指向成员函数参数的指针传递给模板参数
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)...);
}
如何将成员函数指针转发到模板类型参数中。我有以下代码。
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)...);
}