Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将指向成员函数参数的指针传递到模板参数_C++_Templates_Pointers_Delegates_Member - Fatal编程技术网

C++ 将指向成员函数参数的指针传递到模板参数

C++ 将指向成员函数参数的指针传递到模板参数,c++,templates,pointers,delegates,member,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, t

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

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类
{
模板
void boo()
{
/*这里有一些代码*/
}
};
模板
无效foo(ret(T::*memfn)(参数…)
{
自动测试=lol2{};
test.boo();/*错误:在“')标记之前应该有主表达式*/
}
我需要能够将成员函数指针转发到模板参数中。我怎样才能做到这一点


谢谢。

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

test.template boo<memfn>();
test.template boo();
当然,当
memfn
是一个运行时值时,这也不起作用:只有当它是一个常量表达式时,它才能起作用。如果需要处理运行时值,则需要以某种方式传递参数。它可以成为
lol2
的成员,也可以成为
boo()
的附加参数


您还需要修复
lol2
的定义,并使用
T
说明,前提是
DerivedType

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

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)...);  
}
模板
第2类{
T&obj;
公众:
lol2(T&obj_uj):obj(obj_j){}
无效boo(ret(T::*memfn)(params…,params&&…pars){
(obj.*memfn)(标准:远期(PAR)…);
}
};
模板
无效foo(T&obj,ret(T::*memfn)(参数…,参数和…部分){
自动测试=lol2(obj);
测试.boo(memfn,std::forward(pars)…);
}

它应该是
模板
而不是
模板
?示例中没有定义任何
DerivedType
。确实是。谢谢你发现了。成功correction@TartanLlarma:是的-刚刚在发布后发现(并在回答中对此进行了评论)。非常感谢。我对C++完全陌生。如果我错了,请纠正我,这是否意味着类型签名是const,如下所示,void foo(ret(T::*memfn)(params…)const),因为我仍然需要将其推断为模板参数。我想我可以让它与宏一起工作。不管怎样,这都太棒了,谢谢@user2379758:尽管
const
是合法的,但它的含义有所不同(它将传递的成员函数声明为
const
成员,即使其适用于
const
对象)。使用函数参数作为模板参数将不起作用:模板参数在编译时确定,而函数参数值仅在运行时已知。在
boo
中转发确实不是完美的转发。我错了吗?