C ++成员函数重载与& (符号)

时间:2016-03-14 10:17:49

标签: c++ c++11 overloading ampersand

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

React

5 个答案:

答案 0 :(得分:35)

您可以只显式指定成员函数指针类型。

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

答案 1 :(得分: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);

答案 2 :(得分:3)

您需要使用static_cast来消除歧义。

由于函数重载,

&test::error无法计算。 auto的内容并不是立即相关的事实。

一种解决方法是在适当时使用static_cast<int(test::*)()>(&test::error)static_cast<void(test::*)(int)>(&test::error)

然后auto将起作用,因为类型演绎中不存在歧义。

答案 3 :(得分:1)

由于已经给出答案,我将提出一个更容易解决的解决方案。如果您不想每次都写出演员表,这种情况对于宏来说是完美的:

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);

答案 4 :(得分:1)

当你没有互联网阅读丑陋的函数指针到成员语法时,这是解决方案:

auto err1 = [](test& t) { return t.error(); };
auto err2 = [](test& t, int x) { return t.error(x); };

请注意,到目前为止,您将闭包作为类型而不是函数指针。如果你想要函数指针,如果你想在数组中存储具有相同签名的不同成员函数,这很有用,你可以通过+将闭包强制转换为(普通)函数指针(参见here )。

到目前为止我可以看到,通过上面你可以在概念上做任何你可以用函数到成员指针做的事情 - 除了当然调用一个完全需要这样一个指针的例程。而且它更好。