Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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++_Class_Templates_C++17_Member Function Pointers - Fatal编程技术网

C++ 如何将非静态成员函数作为模板参数传递给另一个成员函数?

C++ 如何将非静态成员函数作为模板参数传递给另一个成员函数?,c++,class,templates,c++17,member-function-pointers,C++,Class,Templates,C++17,Member Function Pointers,我想这样做: struct S { void mf() {}; template <auto f> void func() { f(); } }; int main() { S x; x.func<x.mf>(); } 结构 { void mf(){}; 样板 void func() { f(); } }; int main() { sx; x、 func(); } 但是,以下是错误: error: no ma

我想这样做:

struct S
{
   void mf() {};

   template <auto f>
   void func()
   {
      f();
   }
};

int main()
{
   S x;
   x.func<x.mf>();
}
结构
{
void mf(){};
样板
void func()
{
f();
}
};
int main()
{
sx;
x、 func();
}
但是,以下是错误:

error: no matching function for call to 'S::func<x.S::mf>()'`
note: candidate: 'template<auto f> void S::func()'
note:   template argument deduction/substitution failed:
error: could not convert 'x.S::mf' from '<unresolved overloaded function type>' to 'void (S::*)()'
错误:调用'S::func()'时没有匹配的函数`
注意:候选项:“模板无效S::func()”
注意:模板参数扣除/替换失败:
错误:无法将“x.S::mf”从“”转换为“void(S::*)()”
我不确定我是否明白我做错了什么


既然我已经实例化了
x
,为什么没有解析
x.mf
?我怎样才能做到这一点呢?

通过指针调用成员函数可能非常棘手

您想要传递一个指向
S::mf
的成员函数指针:

结构
{
void mf(){std::cout*f();
}
};
int main()
{
sx;
x、 func();
}

通过指针调用成员函数可能非常棘手

您想要传递一个指向
S::mf
的成员函数指针:

结构
{
void mf(){std::cout*f();
}
};
int main()
{
sx;
x、 func();
}

x.mf
不是类型,而是成员函数指针。 我们必须将其作为参数传递

这是您修改过的示例(不确定您想要做什么)

#包括
结构
{
int i=123;

void mf(){std::cout
x.mf
不是类型,而是成员函数指针。 我们必须将其作为参数传递

这是您修改过的示例(不确定您想要做什么)

#包括
结构
{
int i=123;
void mf(){std::cout
既然我已经实例化了
x
,为什么没有解析
x.mf

因为它不是有效的语法。在这里,您需要通过运算符
&
提及成员函数,这意味着您应该

x.func<&S::mf>();
//    ^^^^^^^^
然而,由于这是一种更方便的方法,使用更通用的库函数,所以称为from header

这意味着您可以通过成员函数指针执行更可读的调用,如

#include <functional> // std::invoke

template <auto f>
void func()
{
   std::invoke(f, this);
}
#包括//标准::调用
模板

既然我已经实例化了
x
,为什么没有解析
x.mf

因为它不是有效的语法。在这里,您需要通过运算符
&
提及成员函数,这意味着您应该

x.func<&S::mf>();
//    ^^^^^^^^
然而,由于这是一种更方便的方法,使用更通用的库函数,所以称为from header

这意味着您可以通过成员函数指针执行更可读的调用,如

#include <functional> // std::invoke

template <auto f>
void func()
{
   std::invoke(f, this);
}
#包括//标准::调用

模板

一个问题是你需要传递一个指向函数的指针。一个问题是你需要传递一个指向函数的指针。使用
auto
模板,我们可以毫无问题地传递函数引用。没有auto,我们仍然可以这样做,但我们必须提前知道类型。@AndyG啊,谢谢你提供的信息。我甚至不知道
template
的存在!(我是认真的)不要对自己太苛刻,这是一个相当新的语法,有了
auto
模板,我们可以毫无问题地传递对函数的引用。没有auto,我们仍然可以这样做,但我们必须提前知道类型。@AndyG啊啊,谢谢你提供的信息。我甚至不知道
template
存在!(我是认真的)不要对自己太苛刻,这是一个相当新的语法。谢谢!你能给我一些关键字来查看
(this->*f)的特殊用法吗
以及对
&S::mf
的需求?我也尝试使用std::function代替auto,但无法正常工作。我将其更改为此版本,但仍然无法使用std::function。在这种情况下,f的确切推导是什么?@RexYuan您要查找的关键字是“成员函数指针”谢谢!你能给我一些关键字来查看
(this->*f)的具体用法吗
以及对
&S::mf
的需求?我也尝试使用std::function代替auto,但无法正常工作。我将其更改为此版本,但仍然无法使用std::function。在这种情况下,f的确切推导是什么?@RexYuan您要查找的关键字是“成员函数指针”
#include <functional> // std::invoke

template <auto f>
void func()
{
   std::invoke(f, this);
}