C++ C++;使用&;重载成员函数;(安培)

C++ C++;使用&;重载成员函数;(安培),c++,c++11,overloading,ampersand,C++,C++11,Overloading,Ampersand,如何选择正确的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 } 我是

如何选择正确的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
}
我是否需要以某种方式施展才华

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
}
是的,你可以用

static_cast
也可以通过 执行函数到指针到特定类型的转换,如

std::for_each(files.begin(), files.end(),
              static_cast<std::ostream&(*)(std::ostream&)>(std::flush));
std::for_each(files.begin()、files.end(),
静态浇铸(标准:齐平);
因此,您可以:

auto f1 = static_cast<int(test::*)()>(&test::error);
auto f2 = static_cast<void(test::*)(int)>(&test::error);
auto f1=static\u cast(&test::error);
自动f2=静态_转换(&测试::错误);

您需要使用
静态转换来消除歧义

&test::error
不可计算,因为函数重载。您将其分配给标记为
auto
的对象这一事实并不直接相关

一种修复方法是根据需要使用
static\u cast(&test::error)
static\u cast(&test::error)


然后,
auto
将起作用,因为在类型推断中不会有歧义。

您可以明确指定成员函数指针类型

int (test::*f1)() = &test::error;
void (test::*f2)(int) = &test::error;

既然已经给出了答案,我将给出一个更容易看到的解决方案。如果您不想每次都写出演员阵容,这种情况非常适合宏:

template<class T>
using test_type_t = T test::*;
#define TEST_CAST(T, F) static_cast<test_type_t<T>>(&F)

auto f1 = TEST_CAST(void(int), test::error);
模板
使用测试类型测试=t测试::*;
#定义测试类型(T,F)静态类型(&F)
自动f1=测试(无效(int),测试::错误);

当您没有internet来读取指向成员语法的丑陋函数指针时,以下是解决方案:

auto err1 = [](test& t) { return t.error(); };
auto err2 = [](test& t, int x) { return t.error(x); };
请注意,到目前为止,闭包是作为类型而不是函数指针得到的。如果需要函数指针(如果希望在数组中存储具有相同签名的不同成员函数,这很有用),可以通过
+
将闭包转换为(普通)函数指针(请参见)


就我目前所见,通过上面的内容,您可以在概念上对函数到成员指针执行任何操作——当然,除了调用一个需要这样一个指针的例程之外。它更好些。亲爱的上帝,这太难看了。每次看到C++类型的语法,我都会有写哈希的欲望。强制转换并不是特别必要的,重要的是编译器能够消除应该使用哪种重载(以及需要哪种类型)的歧义。我要补充的是,添加typedef将使事情更加可读:
使用error_func=int(test::*)();error_func f1=&test::error