1

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

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

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

4

3 回答 3

5

如果您要求指针到成员函数,它们作为核心语言的一部分存在,尽管我不会称它们为“简单”:

#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

于 2013-08-11T19:26:53.047 回答
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;
    }
}
于 2013-08-11T19:57:20.677 回答
1

语言附带了一个函数指针类型 - Ret(*)(Args...)。还有一个成员函数指针类型Ret(T::*)(Args...)(尽管它们实际上毫无价值)。此外,您可以使用std::functionstd::bind和 lambda。

于 2013-08-11T19:27:34.917 回答