标准库是否在 C++ 中实现了指向函数的指针类型?
我对仿函数不满意(它们对我来说更像是一个黑客,而不是一个真正的函数指针),你必须创建一个额外的对象,这真的不是我想要的,在 C 中有几个括号和简单的语法,你可以声明一个指向函数的指针,我正在寻找同样的简单性加上一些与类型相关的有用方法,例如在保持对象处于一致状态的同时替换指向函数的能力所有时间。
有类似的东西吗?我真的很怀念 C 和 C++ AFAIK 中普通的旧函数指针,对于作为类或任何其他函数成员的方法来说,没有这样的东西。
标准库是否在 C++ 中实现了指向函数的指针类型?
我对仿函数不满意(它们对我来说更像是一个黑客,而不是一个真正的函数指针),你必须创建一个额外的对象,这真的不是我想要的,在 C 中有几个括号和简单的语法,你可以声明一个指向函数的指针,我正在寻找同样的简单性加上一些与类型相关的有用方法,例如在保持对象处于一致状态的同时替换指向函数的能力所有时间。
有类似的东西吗?我真的很怀念 C 和 C++ AFAIK 中普通的旧函数指针,对于作为类或任何其他函数成员的方法来说,没有这样的东西。
如果您要求指针到成员函数,它们作为核心语言的一部分存在,尽管我不会称它们为“简单”:
#include <iostream>
struct T
{
T(int x) : x(x) {};
void foo() { std::cout << x; }
private:
int x;
};
int main()
{
typedef void (T::*P)();
P fooptr = &T::foo;
T obj(5);
(obj.*fooptr)(); // Output: 5
}
(现场演示)
std::function
, 结合std::bind
, 是一个更好的选择:
#include <iostream>
#include <functional>
struct T
{
T(int x) : x(x) {};
void foo() { std::cout << x; }
private:
int x;
};
int main()
{
using namespace std::placeholders; // for _1, _2, _3...
std::function<void()> f = std::bind(&T::foo, _1); // or auto f = ...
T obj(5);
f(obj); // Output: 5
}
(现场演示)
我建议进一步阅读该主题,因为它不是直接等价的,但允许您将仿函数绑定到成员函数,并为指针提供早期或晚期绑定。this
我知道这个问题已经被回答了,这是一个“真实”的答案,而是一种“但是你有没有想过这种方式”的答案。
虽然函数指针肯定有很多很好的用途(在 C 语言中通常没有其他选择),而且我在 C++ Basic 解释器中使用了指向成员函数的指针(效果很好,我很高兴这是一个很好的解决方案)。
话虽如此,通常最好使用其他替代方法,例如多态性来解决问题。
例如,我们可以使用接口类来使对象具有特定的行为:
class iface
{
public:
virtual int func1() = 0;
};
class A: public iface
{
int x;
...
public:
A(v) : x(v) {}
// from iface
int func1()
{
return x * 42;
}
};
class B: public iface
{
int x;
...
public:
B(v) : x(v) {}
// from iface
int func1()
{
return x * 17;
}
};
vector<iface*> list;
int main()
{
list.push_bacK(new A(12));
list.push_back(new B(15));
for(i : list)
{
cout << i->func1() << endl;
}
}
语言附带了一个函数指针类型 - Ret(*)(Args...)
。还有一个成员函数指针类型Ret(T::*)(Args...)
(尽管它们实际上毫无价值)。此外,您可以使用std::function
、std::bind
和 lambda。