C++ 成员函数重载 & (& 符号)
C++ member function overloading with & (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
}
您可以显式指定成员函数指针类型。
int (test::*f1)() = &test::error;
void (test::*f2)(int) = &test::error;
我需要以某种方式投射吗?
是的,您可以使用 static_cast
.
static_cast
也可用于消除函数重载的歧义:执行到特定类型的函数到指针转换,如std::for_each(files.begin(), files.end(), static_cast<std::ostream&(*)(std::ostream&)>(std::flush));
因此,您可以:
auto f1 = static_cast<int(test::*)()>(&test::error);
auto f2 = static_cast<void(test::*)(int)>(&test::error);
您需要
使用static_cast
来消除歧义。
&test::error
不可评估,因为函数已重载。您将其分配给标记为auto
的东西这一事实并不立即相关。
一种解决方法是酌情使用 static_cast<int(test::*)()>(&test::error)
或static_cast<void(test::*)(int)>(&test::error)
。
然后auto
将起作用,因为类型推断不会有歧义。
既然已经给出了答案,我将提出一个对眼睛来说更容易的解决方案。如果您不想每次都写出演员表,这种情况非常适合宏:
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);
当您
没有互联网来读取丑陋的函数指针到成员语法时,这是解决方案:
auto err1 = [](test& t) { return t.error(); };
auto err2 = [](test& t, int x) { return t.error(x); };
请注意,到目前为止,您将闭包作为类型而不是函数指针。如果你想要函数指针,如果你想在数组中存储具有相同签名的不同成员函数,这很有用,你可以通过+
将闭包强制转换为(普通)函数指针(见这里)。
据我目前所知,通过上述内容,您可以在概念上使用函数到成员指针执行任何操作 - 当然,除了调用完全需要此类指针的例程。而且它更好。
相关文章:
- 继承函数的重载解析
- 你能重载对象变量名本身返回的内容吗
- 从父命名空间重载类型
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 迭代器和无符号整数的重载 + 运算符
- 预处理器是否可以更改运算符重载功能的符号?
- 如何设计符号表来支持函数重载
- 为什么采用 int 的函数重载优先于采用无符号字符的函数重载?
- G++ 错误:重载的"abs(无符号 int)"的调用不明确
- C++ 重载与有符号和无符号 int 不同
- 重载比较符号"<"时,C++升序排序的正确方法
- 运算符重载(以 C++ 和 & 符号为单位)
- 在编译模板方面,char、有符号char或无符号char参数类型的函数重载
- C++ 成员函数重载 & (& 符号)
- 具有多个参数和符号的运算符重载
- 为什么用整数文字调用重载的 ambig(long) 和 ambig(无符号 long)是不明确的
- 重载运算符<<(无符号字符类型定义作为字节)
- 带有操作符重载和模板的无法解析的外部符号
- 未解析的外部符号错误重载操作符+模板