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::coutx.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);
}