C ++中有一个函数指针类型?

时间:2013-08-11 19:20:54

标签: c++ function-pointers

标准库是否为C ++中的函数实现指针类型?

我对仿函数不满意(它们对我来说更像是对一个函数的真正指针),你必须创建一个额外的对象,这真的不是我想要的,在C中使用几个括号和一个简单的语法,您可以声明一个指向函数的指针,我正在寻找相同的简单性以及一些与该类型相关的有用方法,例如,在保持对象一致的同时替换指向函数的能力一直都在说。

有类似的东西吗?我真的很想念C中的普通旧函数指针,而在C ++ AFAIK中,对于作为类或任何其他函数的成员的方法没有这样的东西。

3 个答案:

答案 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
}

live demo


std::functionstd::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
}

live demo

我建议稍微阅读这个主题,因为它不是直接的等价物,但允许你将一个仿函数绑定到一个成员函数,早期的后期绑定{{1} }指针。

答案 1 :(得分:1)

语言附带有一个函数指针类型 - Ret(*)(Args...)。还有一个成员函数指针类型Ret(T::*)(Args...)(虽然它们几乎一文不值)。此外,您可以使用std::functionstd::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;
    }
}
相关问题