用&(和号)重载C++成员函数

Mat*_*fer 27 c++ overloading ampersand c++11

如何选择正确的error()成员函数?我需要以某种方式施展吗?

using namespace std;

struct test
{
   int error();
   void error(int x);
   int fun();
};

int main() {
   auto f1 = &test::error; // how to pick the correct function?
   auto f2 = &test::fun; // works
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*son 35

您只需显式指定成员函数指针类型即可.

int (test::*f1)() = &test::error;
void (test::*f2)(int) = &test::error;
Run Code Online (Sandbox Code Playgroud)

  • 这个; 演员表并不是特别必要,重要的是编译器能够消除应该使用哪个重载(以及因此需要哪种类型)的歧义. (2认同)

son*_*yao 27

我需要以某种方式施展吗?

是的,你可以使用static_cast.

static_cast也可用于通过执行到特定类型的函数到指针转换来消除函数重载的歧义,如

std::transform(s.begin(), s.end(), s.begin(), static_cast<int(*)(int)>(std::toupper));

所以你可以:

auto f1 = static_cast<int(test::*)()>(&test::error);
auto f2 = static_cast<void(test::*)(int)>(&test::error);
Run Code Online (Sandbox Code Playgroud)

  • 亲爱的主人,这很难看. (30认同)
  • 每当我看到C++类型语法时,我就会体验到在Haskell中写一些东西的冲动 - 任何东西. (2认同)