标准库是否为C ++中的函数实现指针类型?
我对仿函数不满意(它们对我来说更像是对一个函数的真正指针),你必须创建一个额外的对象,这真的不是我想要的,在C中使用几个括号和一个简单的语法,您可以声明一个指向函数的指针,我正在寻找相同的简单性以及一些与该类型相关的有用方法,例如,在保持对象一致的同时替换指向函数的能力一直都在说。
有类似的东西吗?我真的很想念C中的普通旧函数指针,而在C ++ AFAIK中,对于作为类或任何其他函数的成员的方法没有这样的东西。
答案 0 :(得分:5)
如果您要求pointers-to-member-functions,这些作为核心语言的一部分存在,但我不会称之为“简单”:
#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
}
我建议稍微阅读这个主题,因为它不是直接的等价物,但允许你将一个仿函数绑定到一个成员函数,早期的或后期绑定{{1} }指针。
答案 1 :(得分:1)
语言附带有一个函数指针类型 - Ret(*)(Args...)
。还有一个成员函数指针类型Ret(T::*)(Args...)
(虽然它们几乎一文不值)。此外,您可以使用std::function
,std::bind
和lambdas。
答案 2 :(得分:1)
我知道这个问题已经得到了回答,这是一个“真正的”答案,而是一种“但你有没有想过这种方式”的答案。
虽然函数指针肯定有很多好的用法(在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;
}
}